这是一个起点。每本字典( {} )在自定义结构中解码,键是结构成员。 [] 代表一个数组。
{}
[]
关键的结构 deals 很漂亮 <击> 愚蠢 击> 不好的 deal 字典实际上是冗余的,需要一个将字典转换为数组的自定义初始化程序。
deals
deal
如果您负责JSON更改它并发送一个简单的字典数组。
日期解码策略 .iso8601 将ISO8601字符串转换为 Date 实例。 关键的解码策略 convertFromSnakeCase 转换 snake_cased 钥匙进入 驼峰格式 属性。 URL字符串被解码为 URL
.iso8601
Date
convertFromSnakeCase
URL
struct Root : Decodable { let query : Query let deals : [Deal] private enum CodingKeys: String, CodingKey { case query, deals } init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) query = try container.decode(Query.self, forKey: .query) let dealData = try container.decode([[String:Deal]].self, forKey: .deals) deals = dealData.map { $0["deal"]! } } } struct Query : Decodable { let total : Int let page : Int let perPage : Int let location : Location } struct Location : Decodable { let latitude, longitude : Double } struct Deal : Decodable { let id : Int let url : URL let createdAt : Date let expiresAt : Date? }
data 假设是JSON的UTF8编码数据
data
let decoder = JSONDecoder() decoder.dateDecodingStrategy = .iso8601 decoder.keyDecodingStrategy = .convertFromSnakeCase let result = try decoder.decode(Root.self, from: data) print(result)