我正在進行 API 呼叫,它回傳以下 JSON 結構(有關各種加密貨幣的價格資訊):
{
"bitcoin": {
"gbp": 34532
},
"ethereum": {
"gbp": 2789.08
}
}
我用來解碼此 JSON 的結構如下所示:
struct Coin: Codable {
let gbp: Double
enum CodingKeys: String, CodingKey {
case gbp
}
}
JSON 沒有被解碼,因為回傳的每個 JSON 元素的父元素都是加密貨幣的名稱,但這會根據呼叫的內容而改變。由于名稱總是在變化,我不確定如何在結構中創建一個變數來映射每個父級。例如,對于這個例子,我可以創建一個這樣的結構:
struct AllCoins: Codable {
let bitcoin, ethereum: Coin
}
這將解碼此特定示例,但如果我獲取其他硬幣,它將不起作用,因為字串名稱不同,因此它們將不匹配。我確定我在這里遺漏了一些簡單的東西,但是有人知道我該如何解決這個問題嗎?
uj5u.com熱心網友回復:
如果名稱可以是任意字串,則您希望解碼[String: Coin]字典。只要Coin是Codable,[String: Coin]也是Codable。
uj5u.com熱心網友回復:
我認為解碼 JSON 的努力Codable比傳統的JSONSerialization. 只要結構總是
{"<name>":
{"<base>": <value>}
}
您可以使用此代碼解碼任何貨幣和任何基數,結果是一個陣列 Coin
let jsonString = """
{
"bitcoin": {
"gbp": 34532
},
"ethereum": {
"gbp": 2789.08
}
}
"""
struct Coin {
let name : String
let base : String
let value : Double
}
var coins = [Coin]()
do {
let result = try JSONSerialization.jsonObject(with: Data(jsonString.utf8)) as! [String:[String:Double]]
coins = result.compactMap{ key, rate in
guard let base = rate.keys.first else { return nil }
return Coin(name: key, base: base, value: rate[base]!)
}
print(coins)
} catch {
print(error)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/403351.html
標籤:
