swift中字典转model你们用的哪个三方?

无夜之星辰
  • 425

之前OC我是用的JSONModel,字典转model就一句代码,很方便,不知道swift有没有同样方便的三方。希望知道的同学可以分享一下,最好贴上实例代码。

评论
阅读 7.7k
7 个回答

HandyJSON
阿里巴巴开源项目,出身名门,比其他的三方便捷,如果使用ObjectMapper,
SwiftyJSON等你肯定受够了那种手动映射!!!!!
所以它最适合用惯了OC中json转model的便捷方式的coder

swift3中json转model确实不方便,这也是网络层最痛苦的事情,不过现阶段找第三方的话找个自己方便使用的就可以了,因为不用等太久,swift4就会到来,swift4对json三方将是一次冲击,官方提供了方便的json转model库,到时候就可以舍弃三方了(也许会有基于官方的上层封装,但是不是太必要)。所以找个自己用着好用的先做项目吧!

HandyJSON和swift4的官方用法很相似!!!

JSONModel在Swift中可以用的. 在class CustomModel: JSONModelcommand + 左键单击 查看JSONModel的API
自定义模型:

import Foundation
import JSONModel

class CustomModel: JSONModel {
    var str: String?
}

赋值打印:

let model = try? CustomModel.init(dictionary: ["str":"hahha"])
print(model?.str ?? "nil")

图片描述

推荐: SwiftyJSON, github链接
如何使用:

初始化:

  let json = JSON(data: dataFromNetworking)
   //这里的object是AnyObject,但是必须是能转会成JSON的数据类型。传错也没关系,最多你后面再也取不到数据了。
   let json = JSON(jsonObject)

Subscript “下标?”:

从一个假定对应的是数组里面取double

let name = json[0].double
从一个假定对应的是字典里面取stringValue,注意多了一个Value

let name = json["name"].stringValue
好玩的来了,从一个数组(好似一个路径中)取string

let name = json[1,"list",2,"name"].string
//上面下面实际上是一样的
let name = json[1]["like"][2]["name"].string


let path = [1,"list",2,"name"]
let name = json[path].string

循环

循环字典:第一个参数是一个key, 第二个参数是JSON

//If json is .Dictionary
for (key: String, subJson: JSON) in json {
   //Do something you want
}
循环数组,注意循环数组也只能用元组,第一个参数是一个string的index, 第二个参数是JSON

//If json is .Array
//The `index` is 0..<json.count's string value
for (index: String, subJson: JSON) in json {
    //Do something you want
}
wjacker
  • 2
新手上路,请多包涵

我用的是Mantle 挺方便的,推荐给你,swift一样能用:
https://github.com/Mantle/Mantle

class TestModel:MTLModel, MTLJSONSerializing {

var a:Int = 0
var jsonb:String = 0

var subModel:TestSubModel?

override class func jsonKeyPathsByPropertyKey() -> [AnyHashable: Any]!
{
    //如果定义的属性跟json字段不匹配的话,可以在这里设置匹配
    return ["a": "jsona"]
}

//包含子类对象的映射
class func subModelJSONTransformer() -> ValueTransformer {
    return ValueTransformer.mtl_JSONDictionaryTransformer(withModelClass: TestSubModel.self)
}

}

千年老妖
  • 4
新手上路,请多包涵
撰写回答

登录后参与交流、获取后续更新提醒

宣传栏