使用 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