Ошибка при попытке фразы JSON со Swift - PullRequest
0 голосов
/ 05 октября 2019

Я пытаюсь получить данные из ссылки JSON в Swift Playground на Mac, я структурирую все данные, но у меня возникают проблемы при попытке декодировать все данные, получая ошибку: «Ссылка на метод экземпляра'decode (_: from :)' в 'Array' требует, чтобы 'Bicimia' соответствовал 'Decodable' '

Я уже пытался добавить опцию Codable / Decodable и пытался соответственно изменить URLSession, но ничего не изменилось.

struct Bicimia {

    let network: Network

}


struct Network {

    let company: [String]
    let href, id: String
    let location: Location
    let name: String
    let stations: [Station]

}

struct Location {

    let city, country: String
    let latitude, longitude: Double

}

struct Station {

    let emptySlots: Int
    let extra: Extra
    let freeBikes: Int
    let id: String
    let latitude, longitude: Double
    let name, timestamp: String

}

struct Extra {

    let extraDescription: String
    let status: Status

}

enum Status {

    case online
}


let url = "https://api.citybik.es/v2/networks/bicimia"
let urlOBJ = URL(string: url)

URLSession.shared.dataTask(with: urlOBJ!) {(data, response, error) in


    do {
        let res = try JSONDecoder().decode([Bicimia].self, from: data!)
        print(res)
    }
    catch {
        print(error)
    }
}.resume()

1 Ответ

0 голосов
/ 05 октября 2019

Чтобы быть Decodable все свойства должны быть Decodable вниз по цепочке:

struct Bicimia: Decodable {
    let network: Network // should be decodable
}

struct Network: Decodable {
    let company: [String]
    let href, id: String
    let location: Location // should be decodable
    let name: String
    let stations: [Station] // should be decodable
}

struct Location: Decodable {
    let city, country: String
    let latitude, longitude: Double
}

struct Station: Decodable {
    let emptySlots: Int
    let extra: Extra // should be decodable
    let freeBikes: Int
    let id: String
    let latitude, longitude: Double
    let name, timestamp: String
}

struct Extra: Decodable {
    let extraDescription: String
    let status: Status // should be decodable
}

enum Status: String, Decodable {
    case online
}

Обратите внимание, что enum s не может быть Decodable в одиночку, потому что они должны знать, что является необработаннымзначение, или вы должны вручную декодировать их в функции decode.

...