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

Итак, я пытаюсь проанализировать 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]
}

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

1 Ответ

0 голосов
/ 10 ноября 2018

Получите ответ 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...