使用 Decodable 解析嵌套的 JSON
Parsing a nested JSON using Decodable
我的 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)
或者我们是否必须绘制出每个嵌套部分?任何帮助或指导将不胜感激! :)
映射出 相关的 键对于您深入研究是必要的,是的。
您可以使用 app.quicktype.io
快速入门并删除不相关的键,如果您真的不想解析其余键,或者如果您以后想使用它,则将其留在那里。
您可以使用我的扩展助手 NestedDecodable,它允许您从 keyPath
中提取 Decodable
。它将此方法添加到 JSONDecoder
:
decoder.decode(Class, from: Data, keyPath: String)
一个关键路径指定你想要的模型的嵌套路径,以.
分隔
所以使用你的例子,这有效(测试):
let characters = try decoder.decode([Character].self, from: data, keyPath: "data.results")
在内部,它创建一个包装器结构来保存您的目标 Decodable
class,将 keyPath
拆分为 .
,然后循环每个键直到它到达最终的键控解码容器,解码该模型和 returns。 Ref
我的 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)
或者我们是否必须绘制出每个嵌套部分?任何帮助或指导将不胜感激! :)
映射出 相关的 键对于您深入研究是必要的,是的。
您可以使用 app.quicktype.io
快速入门并删除不相关的键,如果您真的不想解析其余键,或者如果您以后想使用它,则将其留在那里。
您可以使用我的扩展助手 NestedDecodable,它允许您从 keyPath
中提取 Decodable
。它将此方法添加到 JSONDecoder
:
decoder.decode(Class, from: Data, keyPath: String)
一个关键路径指定你想要的模型的嵌套路径,以.
所以使用你的例子,这有效(测试):
let characters = try decoder.decode([Character].self, from: data, keyPath: "data.results")
在内部,它创建一个包装器结构来保存您的目标 Decodable
class,将 keyPath
拆分为 .
,然后循环每个键直到它到达最终的键控解码容器,解码该模型和 returns。 Ref