Контейнер без ключа JSON Swift Decodable - PullRequest
0 голосов
/ 27 мая 2019

Я пытаюсь декодировать некоторые JSON.Вот пример JSON:

 [
    {
        "type": "departure",
        "status": "landed",
        "departure": {
            "iataCode": "JFK",
            "icaoCode": "KJFK",
            "scheduledTime": "2017-12-11T01:06:00.000",
            "estimatedRunway": "2017-12-11T02:07:00.000",
            "actualRunway": "2017-12-11T02:07:00.000" },
        "arrival": {
            "iataCode": "CVG",
            "icaoCode": "KCVG",
            "estimatedRunway": "2017-12-11T03:38:00.000",
            "actualRunway": "2017-12-11T03:38:00.000"
        },
        "airline": {
            "name": "Atlas Air",
            "iataCode": "5Y",
            "icaoCode": "GTI"
        },
        "flight": {
            "number": "302",
            "iataNumber": "5Y302",
            "icaoNumber": "GTI302"
        }
    }, 
    {

        //Same keys as above.
    }, 
    //Etc.
]

Он начинается как массив без ключа.Затем это выполняется контейнерами JSON, которые также не имеют ключей.У меня проблемы с его разбивкой на части с использованием этого кода:

struct Dataset: Decodable {

    var data: [FlightData]

    init(from decoder: Decoder) throws {
        var container = try decoder.unkeyedContainer()
        print(container)
        data = [try container.decode(FlightData.self)]
    }

struct FlightData: Decodable {

    var type: String //Arrival or Departure
    var status: String //Flight Status

    var departure: Departure
    var arrival: Arrival
    var airline: Airline
    var flight: Flight

    struct Departure: Decodable {

        var iataCode: String
        var icaoCode: String
        var terminal: String
        var gate: String
        var scheduledTime: String
        var estimatedTime: String
        var actualTime: String
        var estimatedRunway: String
        var actualRunway: String

    }

    struct Arrival: Decodable {

        var iataCode: String
        var icaoCode: String
        var terminal: String
        var gate: String
        var baggage: String
        var scheduledTime: String
        var estimatedTime: String
        var actualTime: String
        var estimatedRunway: String
        var actualRunway: String

    }

    struct Airline: Decodable {

        var name: String
        var iataCode: String
        var icaoCode: String

    }

    struct Flight: Decodable {

        var number: String
        var iataNumber: String
        var icaoNumber: String

    }

}
}

Я новичок в JSON и Swift Decodable, поэтому я немного запутался, что я делаю неправильно?Кто-нибудь знает, как я могу исправить мою проблему?Прямо сейчас я получаю предупреждение, что он ожидает массив, но он находит словарь.Поэтому я думаю, что успешно прошел первый неиспользованный контейнер, но я не могу проникнуть в него.

1 Ответ

1 голос
/ 27 мая 2019

Удалите ваш метод инициализации, а затем выполните

let decoder = JSONDecoder()

do {
    data = try decoder.decode([FlightData].self, from: data) 
} catch {
    print(error)
}
...