使用Decodable解析嵌套的JSON

时间:2018-09-28 22:40:56

标签: json swift 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)

还是我们必须绘制每个嵌套部分?任何帮助或指导将不胜感激! :)

2 个答案:

答案 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