Я не могу расшифровать свой JSON. Он находит и загружает, но не может декодировать.
Вот пример JSON:
[{
"name": "Hartsfield Jackson Atlanta Intl",
"city": "Atlanta",
"country": "United States",
"iata_code": "ATL",
"_geoloc": {
"lat": 33.636719,
"lng": -84.428067
},
"links_count": 1826,
"objectID": "3682"}]
Вот моя структура:
struct Airports: Codable, Identifiable {
struct GeoLoc: Codable {
let lat: Double
let lng: Double
}
var id = UUID()
let name: String
let city: String
let country: String
let iata_code: String
let _geoloc: GeoLoc
let links_count: Int
let objectID: String }
Натяжение комплекта:
extension Bundle {
func decode<T: Codable>(_ file: String) -> T {
guard let url = self.url(forResource: file, withExtension: nil) else {
fatalError("Failed to locate \(file) in bundle.")
}
guard let data = try? Data(contentsOf: url) else {
fatalError("Failed to load \(file) from bundle.")
}
let decoder = JSONDecoder()
let formatter = DateFormatter()
formatter.dateFormat = "y-MM-dd"
decoder.dateDecodingStrategy = .formatted(formatter)
guard let loaded = try? decoder.decode(T.self, from: data) else {
fatalError("Failed to decode \(file) from bundle.")
}
return loaded
}}
И я называю это в своем представлении содержимого следующим образом:
let airports: [Airports] = Bundle.main.decode("airports.json")
Я получаю фатальную ошибку («Не удалось декодировать (файл) из пакета».) Итак, мой вопрос: что здесь не так? Ошибка в моей структуре аэропорта? Я знаю, что расширение пакета работает, я использовал его со многими другими JSONS.
По какой-то причине я обнаружил, что «var id = UUID()» был причиной проблемы… не совсем уверен, почему
Именно из-за свойства id
в вашей структуре у вашего json нет ключа id
, а id
в структуре нет optional
. Вы должны изменить его с помощью
let id : UUID?
вместо
var id = UUID()
измените
try?
наtry
, используйтеdo catch
иprint(error)
вcatch
. вы получите гораздо лучшее описание там.