iOS必须Swift

swift json转模型

2018-07-10  本文已影响0人  凨弥

简介

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格式

上一篇下一篇

猜你喜欢

热点阅读