Как массив 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"
    }
]


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