Home > database >  Faild to decode JSON, SwiftUI
Faild to decode JSON, SwiftUI

Time:03-19

I can’t seem to decode my JSON. It locates, and loads, but fails to decode.

Here is the JSON example:

[{
"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"}]

Here is my Struct:

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 }

Bundle etension:

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
}}

And I call it in my content View like this:

let airports: [Airports] = Bundle.main.decode("airports.json")

I get the fatalError("Failed to decode (file) from bundle.") So my question is, what is wrong here? Is the mistake in my Airport Struct? I know the bundle extension is working, I have used the same with many other JSONS.

CodePudding user response:

It is beacuse of property of id in your structure your json has no key id and id in structure is not optional. You have to change it with

let id : UUID?

instead of

var id = UUID()
  • Related