Расшифровка гетерогенного массива

Я нашел много примеров, касающихся реализации для декодирования массива разнородных объектов, но они не совсем соответствуют моей ситуации.

Вот мой JSON:

{
  "response": [
    {
      "label": "Shore",
      "marineReports": [
        {
          "id": 1,
          "label": "Label"
        },
        {
          "id": 2,
          "label": "Label"
        }
      ]
    },
    {
      "label": "Open Sea",
      "marineReports": [
        {
          "id": 0,
          "label": "Label"
        },
        {
          "id": 0,
          "label": "Label"
        }
      ]
    },
    {
      "label": "Offshore",
      "marineReports": [
        {
          "id": 3,
          "label": "Label"
        },
        {
          "id": 3,
          "label": "Label"
        },
        {
          "id": 3,
          "label": "Label"
        }
      ]
    },
    {
      "label": "Special Reports",
      "specialReports": [
        {
          "label": "Atlantic-Channel",
          "reports": [
            {
              "id": 12,
              "label": "Offshore Atlantic"
            },
            {
              "id": 17,
              "label": "Channel"
            }
          ]
        }
      ]
    }
  ]
}

Вот что я реализовал сначала:

struct ResponseSea: Codable {
    let result: [SeaArea]
}

struct SeaArea: Codable {
    var label: String
    var reports: [MarineReport]

    struct MarineReport: Codable {
        var id: Int
        var label: String
    }
}

Но потом я понял, что последний объект в результирующем массиве отличается от других. Как я могу реализовать пользовательскую логику синтаксического анализа для конкретного объекта в массиве того же типа объекта?

1 ответ

Решение

Исходя из вашего JSON это должно быть так:

struct RootObject: Codable {
    let response: [Response]
}

struct Response: Codable {
    let label: String
    let marineReports: [Report]?
    let specialReports: [SpecialReport]?
}

struct Report: Codable {
    let id: Int
    let label: String
}

struct SpecialReport: Codable {
    let label: String
    let reports: [Report]
}

marineReports а также specialReports являются необязательными, поскольку они могут отсутствовать.

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