Swift4中使用Codable协议

进行iOS开发时,与后台数据的交互格式通常是JSON,OC时代,有很多第三方可以完成JSON与Model的互转,都是基于Runtime来完成的,比如MJExtensionYYModel等。但是在Swift里,struct成了一等公民,身为值类型,在内存上优化了很多,所以要写Swift化的代码,Model通常是struct类型的,阿里开源的HandyJSON可以很好的完成互转,但是毕竟是第三方,还是原生的比较好(比如我今天更新Xcode9.3,然后就崩溃了,issue上一看,十几天前就有人用beta版遇到了,作者也没跟进问题,我索性都改成了Codable)。这一切在Swift4里通过Codable解决了,再也不用第三方了😄
比如,我们从后台获取了以下JSON数据:

{
  "nu" : "11111111111",
  "status" : "200",
  "ischeck" : "0",
  "condition" : "00",
  "data" : [
    {
      "location" : null,
      "ftime" : "2017-12-18 16:37:45",
      "time" : "2017-12-18 16:37:45",
      "context" : "快件已到达华林二路40号圆通营业厅妈妈驿站,如有疑问请联系15208326965"
    },
    {
      "location" : null,
      "ftime" : "2017-06-07 11:21:03",
      "time" : "2017-06-07 11:21:03",
      "context" : "北服小北门圆通速递妈妈驿站已发出自提短信,请上门自提,如有疑问请联系13370110797"
    }
  ],
  "message" : "ok",
  "com" : "yuantong",
  "state" : "5"
}

可以把这个数据粘贴到JSONConverter里:

完成JSON转struct

然后创建一个Model,粘贴过来,稍微修改一下,就可以了:

struct DetailModel: Codable {
    var state: String?
    var status: String?
    var data = [DetailDataModel]()
    var nu: String?
    var com: String?
    var message: String?
    var condition: String?
    var ischeck: String?
}

struct DetailDataModel: Codable {
    var ftime: String?
    var time: String?
    var context: String?
    var heightcm: String?
//也可以自定义属性名,比如后台有个json字段叫Height_cm,
//此时,我们需要自定义CodingKeys,必须全部写一遍,
//这个比较坑,如果某个属性不想从json里读取,可以在这里忽略
    enum CodingKeys: String, CodingKey {
        case ftime
        case time
        case context
        case  heightcm = "Height_cm"
    }
}

需要遵守Codable协议才能完成转换,接下来就是使用:

        let path = Bundle.main.url(forResource: "Json.geojson", withExtension: nil)
        
        let data = try? Data.init(contentsOf: path!)
        let model = try? JSONDecoder().decode(DetailModel.self, from: data!)
        
        print("model====\(model!)")
        
        let jsondic = try? JSONEncoder().encode(model!)
        let jsonstr = String.init(data: jsondic!, encoding: .utf8)
        
        print("jsonstr===\(jsonstr!)")

这里JSON数据是从Json.geojson文件里读取的

CodableDemo

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 嗯哼嗯哼蹦擦擦~~~ 转载自:https://github.com/Tim9Liu9/TimLiu-iOS 目录 ...
    philiha阅读 4,993评论 0 6
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,188评论 4 61
  • 终于,我梦寐以求的时刻终于到来了。 传媒上劈天盖地的报道我的事迹,介绍我的学术观点,称赞我的标新立异,更有甚者标榜...
    南提无阿阅读 914评论 1 13
  • 阳光明媚的让人睁不开眼,蔚蓝的天空上厚重的云朵纠缠在一起窃窃私语,蒲公英又开始绽放可爱的花朵,紫薇花依旧开的火热,...
    爱曲小姐阅读 348评论 0 0