我的JSON结构如下:
{
"code": 200,
"status": "Ok",
"etag": "7232324423",
"data": {
"offset": 0,
"limit": 25,
"results": [{
"id": 1011244,
"name": "Miss Nesbit",
"description": "",
"modified": "2018-04-04T20:15:35-0400",
"thumbnail": {
"path": "http://i.annihil.us/u/prod/i/mg/8/70/4c002efc322e3",
"extension": "jpg"
}
},
{
"id": 1011244,
"name": "Miss Solis",
"description": "",
"modified": "2018-09-04T20:15:35-0400",
"thumbnail": {
"path": "http://i.annihil.us/u/prod/i/mg/8/70/4c002efc382e3",
"extension": "jpg"
}
}
]
}
}
我想按以下结构解析结果:
struct Character: Codable {
let id: Int
let name: String
let thumbnail: Thumbnail
let description: String
}
但是我对指定的位置有些困惑,我只想要results
部分?如下实现Decodable时,我会这样做吗?
let container = try decoder.container(keyedBy: CodingKeys.self)
let data = try container.nestedContainer(keyedBy: CodingKeys.self, forKey: .data)
let results = try container.nestedContainer(keyedBy: CodingKeys.self, forKey: .results)
还是我们必须绘制每个嵌套部分?任何帮助或指导将不胜感激! :)
答案 0 :(得分:3)
映射相关键对于为您进行深入分析是必要的。
如果您确实不想解析其余部分,则可以使用app.quicktype.io
快速入门并删除不相关的键,或者如果以后要使用它,可以将其保留在那里。
答案 1 :(得分:2)
您可以使用我的扩展程序帮助程序NestedDecodable,该帮助程序使您可以从Decodable
中提取keyPath
。它将此方法添加到JSONDecoder
:
decoder.decode(Class, from: Data, keyPath: String)
关键路径指定所需模型的嵌套路径,以.
因此,以您的示例为例,它可以工作(经过测试):
let characters = try decoder.decode([Character].self, from: data, keyPath: "data.results")
在内部,它创建一个包装器结构来保存目标Decodable
类,将keyPath
除以.
,然后向下循环每个密钥,直到到达最终的密钥解码容器为止,对该模型进行解码并返回。 Ref