简介
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格式
网友评论