Как декодировать массив JSON внутри другого массива - PullRequest
0 голосов
/ 25 апреля 2019

Я играю с API-интерфейсом TFL в быстром, в частности, с API-интерфейсом состояния линии, но у меня возникают проблемы с декодированием statusSeverityDescription внутри вложенного объекта lineStatuses. В идеале я хотел бы получить name строки и statusSeverityDescription вместе.

Я могу правильно декодировать name строки из JSON, поэтому я уверен, что проблема заключается только в ошибке декодирования массива.

вот URL для рассматриваемого API: https://api.tfl.gov.uk/line/mode/tube/status?detail=true

struct Line : Decodable {
    let name : String
    let lineStatuses : Status
}

struct Status : Decodable {
    let statusSeverityDescription : String

    private enum CodingKeys : String, CodingKey {
        case statusSeverityDescription = "statusSeverityDescription"
    }

    init(from decoder : Decoder) throws {
        if let container = try? decoder.container(keyedBy: CodingKeys.self) {
            self.statusSeverityDescription = try! container.decode(String.self, forKey: .statusSeverityDescription)
        } else {
            let context = DecodingError.Context.init(codingPath: decoder.codingPath, debugDescription: "Unable to decode statuses!")
            throw DecodingError.dataCorrupted(context)
                }
    }

//this is in the UrlSession function

if let journey = try? JSONDecoder().decode([Line].self, from: data) 
        print(journey)

1 Ответ

0 голосов
/ 25 апреля 2019

lineStatuses - это массив, поэтому измените его объявление в Line, как показано ниже,

struct Line : Decodable {
    let name : String
    let lineStatuses : [Status]
}

Также вы можете опустить объявление init в Status как,

struct Status : Decodable {

    let statusSeverityDescription : String
} 
...