Разбор вложенного JSON с использованием Decodable - PullRequest
0 голосов
/ 29 сентября 2018

Моя структура 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 голосов
/ 29 сентября 2018

Вы можете использовать мой помощник расширения 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

0 голосов
/ 29 сентября 2018

Назначение соответствующих ключей необходимо для детализации, да.

Вы можете использовать app.quicktype.io, чтобы быстро начать работу и удалить ненужные ключи, если вы действительноне хотите разбирать остальное или оставлять его там, если хотите использовать его позже.

...