swift json转模型

2019-04-13 20:58发布

简介

swift中,主流的json转模型有两种:原生实现(Decodable)HandyJSON
本人之前HandyJSON,后Xcode升级10.0之后,项目报语法错误,官网需要等苹果给出明确写法之后才能更新,等不了,还原生实现。 *HandyJSON官方文档上有很多教程方法介绍,简单易用,这里不过多介绍。

原生实现(Decodable)

1、创建结构体

需要注意:
*不能确定这些字断有值的,需要加可选,不然解析不成功
*对映json中字断的key值 如果都是一样 可以不写,不一样如下
/** 不能确定这些字断有值的,需要加可选,不然解析不成功 */ public struct testModel:Decodable{ var user:String var id:String var model:String? ///对映json中字断的key值 如果都是一样 可以不写 enum CodingKeys:String,CodingKey { case id = "deviceId" case user = "name" case model } } 创建一个Geojson文件内容如下: [{ "deviceId": "G7594S992Q", "name": "1111111111111111111111111111111", "model": "iPhone X", }, { "deviceId": "9D632SMR8G", "name": "12345", "model": "iPhone 7 Plus", }] 这里需要注意下:创建的json文件需要添加到 Copy Bundle resources中,不然 Bundle获取不到文件。方法:Targets->Build Phases ->Copy Bundle resources func testJson(){ guard let url = Bundle.main.path(forResource: "jsonData", ofType: "geojson") else { print("url 没有数据")//如果没有取到,按照上面步骤验查一下。 return } let data = try? Data(contentsOf: URL(fileURLWithPath: url), options: Data.ReadingOptions.alwaysMapped) guard let arr = try? JSONDecoder().decode([testModel].self, from: data!) else { print("arr 没有数据") return } print("arr =(arr)") } 执行结果: arr =[test1.testModel(user: "1111111111111111111111111111111", id: "G7594S992Q", model: Optional("iPhone X")), test1.testModel(user: "12345", id: "9D632SMR8G", model: Optional("iPhone 7 Plus"))] 如果获取的数据是字典格式
try? JSONDecoder().decode(testModel.self, from: data!) 如果是字典中嵌套需要取得值,此处可以灵活运用。
try? JSONDecoder().decode([String:testModel].self, from: data!)
也可以是同类型的数组或者字典
try? JSONDecoder().decode([String:[String:String]].self, from: data!)
注意:拿到的data必须要转成 Data.ReadingOptions.alwaysMapped格式