Как массив JSON, в котором перечислены различные объекты, может быть декодирован в несколько структур с помощью Swift JSONDecoder?
Используя этот объект JSON в качестве примера:
{
data: [
{
type: "animal"
name: "dog"
consumes: "dog food"
},
{
type: "plant"
name: "cactus"
environment: "desert"
}
]
}
Обратите внимание animal
а также plant
Типы имеют несколько различных свойств и некоторые общие свойства.
Как бы JSONDecoder
использоваться в Swift для преобразования их в следующие структуры:
struct Animal: Decodable {
let name: String
let consumes: String
}
struct Plant: Decodable {
let name: String
let environment: String
}
2 ответа
Вы можете немного изменить свои структуры, как это
enum ItemType {
case animal(consumes: String)
case plant(environment: String)
case unknown
}
struct Item: Decodable {
let name: String
let type: ItemType
enum CodingKeys: CodingKey {
case name
case type
case consumes
case environment
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
self.name = try values.decode(String.self, forKey: .name)
let type = try values.decode(String.self, forKey: .type)
switch type {
case "animal":
let food = try values.decode(String.self, forKey: .consumes)
self.type = .animal(consumes: food)
case "plant":
let environment = try values.decode(String.self, forKey: .environment)
self.type = .plant(environment: environment)
default:
self.type = .unknown
}
}
}
Попробуйте сделать согласованную структуру массива
{
data: {
animals:[
{
type: "animal"
name: "Cat"
consumes: "cat food"
},
{
type: "animal"
name: "dog"
consumes: "dog food"
}
],
plants:[
{
type: "plant"
name: "cactus"
environment: "desert"
},
{
type: "plant"
name: "Plam"
environment: "hill"
}
]
}
}