Получите ответ 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)