SWIFT 5中的嵌套JSON

SWIFT 5中的嵌套JSON,json,swift,xcode,jsondecoder,Json,Swift,Xcode,Jsondecoder,尽管有很多关于嵌套json解码的文章,但我仍在努力解决以下问题: 来自json的示例: { "00AK": { "icao": "00AK", "iata": "", "name": "Lowell Field", "city": "Anchor Point", "state": "Alaska", "country": "US", "elevation": 450,

尽管有很多关于嵌套json解码的文章,但我仍在努力解决以下问题:

来自json的示例:

{
    "00AK": {
        "icao": "00AK",
        "iata": "",
        "name": "Lowell Field",
        "city": "Anchor Point",
        "state": "Alaska",
        "country": "US",
        "elevation": 450,
        "lat": 59.94919968,
        "lon": -151.695999146,
        "tz": "America\/Anchorage"
    },
    "00AL": {
        "icao": "00AL",
        "iata": "",
        "name": "Epps Airpark",
        "city": "Harvest",
        "state": "Alabama",
        "country": "US",
        "elevation": 820,
        "lat": 34.8647994995,
        "lon": -86.7703018188,
        "tz": "America\/Chicago"
    },
    "00AZ": {
        "icao": "00AZ",
        "iata": "",
        "name": "Cordes Airport",
        "city": "Cordes",
        "state": "Arizona",
        "country": "US",
        "elevation": 3810,
        "lat": 34.3055992126,
        "lon": -112.1650009155,
        "tz": "America\/Phoenix"
    },
    ....
}
我首先用以下结构映射机场细节:

struct Airport : Codable {
    var icao:String
    var iata:String
    var name:String
    var city:String
    var state:String
    var country:String
    var elevation: Double
    var lat: Double
    var lon: Double
    var tz: Double
    enum CodingKeys : String, CodingKey {
        case icao
        case iata
        case name
        case city
        case state
        case country
        case elevation
        case lat
        case lon
        case tz
    }
}

但我被卡住了-无法找到如何映射机场代码(00AK、00AL、00AZ)的“母亲”结构,以及如何查找此处解析的解码数据:

let decodedData = try JSONDecoder().decode(AirportsStructToBeCreated.self,
                                                                      from: jsonData)

(例如,如何查找“00AZ”的“标高”)

您必须解码
[String:Airport]
字典

let decodedData = try JSONDecoder().decode([String:Airport].self,
                                                                  from: jsonData)
或者您可以实现
init(从解码器
),并将字典映射到数组,因为键也包含在结构中

如果结构成员与字典键完全匹配,则可以省略编码键


tz
不是双你必须解码
[字符串:机场]
字典

let decodedData = try JSONDecoder().decode([String:Airport].self,
                                                                  from: jsonData)
或者您可以实现
init(从解码器
),并将字典映射到数组,因为键也包含在结构中

如果结构成员与字典键完全匹配,则可以省略编码键


如果使用json:[{“icao”:“00AK”,“iata”:“name”:“Lowell Field”,“city”:“Anchor Point”,“state”:“Alaska”,“country”:“US”,“elevation”:450,“lat”:59.94919968,“lon”:-151.695999146,“tz”:“America\/Anchorage”},{…}]它适用于:let decodedata=try JSONDecoder().decode([Airport].self,from:jsonData)…为什么要问一个关于完全不同的JSON结构的问题?抱歉,这是不必要的(只是试图排除代码其余部分中的其他错误),我想使用原始结构,但建议使用“let decodedata=try JSONDecoder().decode”([String:Airport].self,from:jsonData“…给出了解码错误,不知道为什么..什么
解码错误
?再次抱歉不清楚:“try”会抛出错误,但如果使用json:[{“icao”:“00AK”,“iata”:“name”:“Lowell Field”,“city”:“锚点”,“state”:“Alaska”,“country”:“US”,“elevation”:450,“lat”:59.94919968,“lon”:-151.695999146,“tz”:“America\/Anchorage”},{…}它与:let decodedata=try JSONDecoder().decode([Airport].self,from:jsonData)…一起工作。为什么要问一个关于完全不同的JSON结构的问题?抱歉,这是不必要的(只是试图排除代码其余部分的其他错误),我想使用原始结构,但您建议的“let decodedata=try JSONDecoder().decode([String:Airport].self,from:jsonData)”…给出了解码错误,并且不明白为什么..什么
解码错误
?再次为不清楚而道歉:“try”将抛出错误