访问 Swift 中解码的 JSON 字典项的语法

Syntax to access decoded JSON dictionary items in Swift

我正在尝试解码一些 JSON,但正在为如何访问 JSON 中的项目而苦苦挣扎。

JSON 看起来像这样并且 JSONlint 确认它是有效的 json

{
  "USD" : {"15m" : 9161.16, "last" : 9161.16, "buy" : 9161.16, "sell" : 9161.16, "symbol" : "$"},
  "EUR" : {"15m" : 8175.89, "last" : 8175.89, "buy" : 8175.89, "sell" : 8175.89, "symbol" : "€"},
  "JPY" : {"15m" : 985609.11, "last" : 985609.11, "buy" : 985609.11, "sell" : 985609.11, "symbol" : "¥"}
}

app.quicktype.io 建议使用此结构进行解码,但没有货币变量:

struct BitcoinQuoteReturned: Codable {
    let the15M, last, buy, sell: Double
    let symbol: String

    enum CodingKeys: String, CodingKey {
        case the15M = "15m"
        case last, buy, sell, symbol
    }
}

无效代码:

let myquote = try? JSONDecoder().decode(BitcoinQuoteReturned.self, from: data)                           
if let aquote = myquote {
let usdquote = aquote.USD//ERROR
}

当我尝试在 Swift 中解码时,我不知道如何访问特定货币。 aquote.USD 给出 class 没有成员错误,而 aquote["USD"] 和 aquote[1] 给出没有下标成员错误。如何访问 JSON 中的美元行?

感谢您的任何建议。

解析时使用[String:BitcoinQuoteReturned].self代替BitcoinQuoteReturned,即

let myquote = try? JSONDecoder().decode([String:BitcoinQuoteReturned].self, from: data) //here...
if let aquote = myquote {
    let usdquote = aquote["USD"]
    print(usdquote)
}

注意:调用decode(_:from:)时使用do-catch语句,在catch语句中打印整个error。这将在解析时为您详细说明问题存在的位置。

do {
    let myquote = try JSONDecoder().decode([String:BitcoinQuoteReturned].self, from: data)
    let usdquote = myquote["USD"]
    print(usdquote)
} catch {
    print(error)
}