Итак, я пытаюсь разобрать 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]
}
Есть ли лучший способ сделать это, или я застрял в этом.

Возьмите свой ответ 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)
Ключи кодирования - это PITA, но иногда их нужно использовать. Если вы работаете в производственной среде или у вас есть собственные данные, вы бы создали свою структуру «старомодным» способом, а не с этим сайтом.
Спасибо, Адриан, предоставленный вами сайт очень полезен. Я также знал, что вы можете использовать стратегию кодирования от случая змеи к случаю верблюда. Просто хотел попрактиковаться в использовании клавиш кодирования, на случай, если я захочу поменять имена. Так что для меня это выглядит одинаково, так что я думаю, что я застрял в этом. Но спасибо за этот полезный сайт. :)