Разбор вложенного JSON с помощью Codable

Итак, я пытаюсь разобрать JSON, который выглядит примерно так, используя Codable в Swift.

{
"abilities": [
    {
        "ability": {
            "name": "chlorophyll",
            "url": "https://pokeapi.co/api/v2/ability/34/"
        },
        "is_hidden": true,
        "slot": 3
    },
    {
        "ability": {
            "name": "overgrow",
            "url": "https://pokeapi.co/api/v2/ability/65/"
        },
        "is_hidden": false,
        "slot": 1
    }
],
"name": "SomeRandomName"
}

Теперь это сбивает с толку, когда вы пытаетесь получить вложенные данные. Теперь я пытаюсь узнать это имя, и это несложно. Я также пытаюсь узнать название способности, здесь все усложняется для меня. После некоторого исследования я пришел к этому.

class Pokemon: Codable {

struct Ability: Codable {
    var isHidden: Bool

    struct AbilityObject: Codable {
        var name: String
        var url: String
    }

    var ability: AbilityObject

    private enum CodingKeys: String, CodingKey {
        case isHidden = "is_hidden"
        case ability
    }
}

var name: String
var abilities: [Ability]
}

Есть ли лучший способ сделать это, или я застрял в этом.

Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
1
0
384
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Возьмите свой ответ JSON и сбросьте его в этот сайт.

Эти структуры будут созданы без Codable. Добавьте Codable, чтобы они выглядели так:

struct Pokemon: Codable {
    let abilities: [AbilityElement]
    let name: String

    struct AbilityElement: Codable {
        let ability: Ability
        let isHidden: Bool
        let slot: Int

        struct Ability: Codable {
            let name: String
            let url: String
        }
    }
}

Для ключей с snake_case вы можете просто объявить JSONDecoder и указать keyDecodingStrategy как .convertFromSnakeCase. Не нужно возиться с ключами кодирования, если вы просто конвертируете из змеиного футляра. Они вам понадобятся, только если вы переименовываете ключи.

Если у вас есть другие ситуации, когда вам нужно создать собственные ключи кодирования для ваших ответов или изменить имена ключей, эта страница может оказаться полезным.

Вы можете бросить это на детскую площадку и поиграть с ним:

let jsonResponse = """
{
    "abilities": [
    {
        "ability": {
        "name": "chlorophyll",
        "url": "https://pokeapi.co/api/v2/ability/34/"
    },
    "is_hidden": true,
    "slot": 3
    },
    {
    "ability": {
        "name": "overgrow",
        "url": "https://pokeapi.co/api/v2/ability/65/"
    },
    "is_hidden": false,
    "slot": 1
    }
    ],
    "name": "SomeRandomName"
}
"""

struct Pokemon: Codable {
    let abilities: [AbilityElement]
    let name: String

    struct AbilityElement: Codable {
        let ability: Ability
        let isHidden: Bool
        let slot: Int

        struct Ability: Codable {
            let name: String
            let url: String
        }
    }
}

var pokemon: Pokemon?

do {
    let jsonDecoder = JSONDecoder()
    jsonDecoder.keyDecodingStrategy = .convertFromSnakeCase
    if let data = jsonResponse.data(using: .utf8) {
        pokemon = try jsonDecoder.decode(Pokemon.self, from: data)
    }
} catch {
    print("Something went horribly wrong:", error.localizedDescription)
}

print(pokemon)

Спасибо, Адриан, предоставленный вами сайт очень полезен. Я также знал, что вы можете использовать стратегию кодирования от случая змеи к случаю верблюда. Просто хотел попрактиковаться в использовании клавиш кодирования, на случай, если я захочу поменять имена. Так что для меня это выглядит одинаково, так что я думаю, что я застрял в этом. Но спасибо за этот полезный сайт. :)

Luis F Ramirez 10.11.2018 05:05

Ключи кодирования - это PITA, но иногда их нужно использовать. Если вы работаете в производственной среде или у вас есть собственные данные, вы бы создали свою структуру «старомодным» способом, а не с этим сайтом.

Adrian 10.11.2018 05:08

Другие вопросы по теме