【问题标题】:Nested JSON in SWIFT 5SWIFT 5 中的嵌套 JSON
【发布时间】:2020-06-03 19:06:05
【问题描述】:

尽管有很多关于嵌套 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”的“海拔”)

【问题讨论】:

    标签: json swift xcode jsondecoder


    【解决方案1】:

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

    let decodedData = try JSONDecoder().decode([String:Airport].self,
                                                                      from: jsonData)
    

    或者您可以实现 init(from decoder 并将字典映射到数组,因为键也包含在结构中。

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

    而tz 不是双倍

    【讨论】:

    • 但如果使用 json: [{ "icao": "00AK", "iata": "", "name": "Lowell Field", "city": "Anchor Point", "state ":"阿拉斯加","国家":"美国","海拔":450,"纬度":59.94919968,"经度":-151.695999146,"tz":"美国\/安克雷奇"},{...} ] 它适用于: let decodedData = try JSONDecoder().decode([Airport].self, from: jsonData) ...
    • 为什么要问一个关于完全不同的 JSON 结构的问题?
    • 对不起,这是不必要的(只是试图排除其余代码中的其他错误),我想使用原始结构,但您建议“让 decodedData = try JSONDecoder().decode([String :Airport].self, from: jsonData)" ...给出解码错误,不知道为什么..
    • 什么DECODE ERROR?
    • 再次抱歉,不清楚:“try”会抛出错误
    猜你喜欢
    • 1970-01-01
    • 2021-07-31
    • 2021-12-11
    • 2021-07-18
    • 2016-12-31
    • 1970-01-01
    • 2020-03-30
    • 2020-03-03
    • 1970-01-01
    相关资源
    最近更新 更多