进行iOS开发时,与后台数据的交互格式通常是JSON,OC时代,有很多第三方可以完成JSON与Model的互转,都是基于Runtime来完成的,比如MJExtension、YYModel等。但是在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里:
然后创建一个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文件里读取的
网友评论