我有一個如下所示的 API JSON 回應。我想解碼 JSON 以獲得字典陣列[String:Double],例如[{"2020-01-01" : 0.891186}, {"2020-01-02" : 0.891186}].
{
"rates": {
"2020-01-01": {
"EUR": 0.891186
},
"2020-01-02": {
"EUR": 0.891186
},
"2020-01-03": {
"EUR": 0.895175
},
"2020-01-04": {
"EUR": 0.895175
}
}
}
我寫了如下解碼代碼:
do {
let data = try Data(contentsOf: appURL)
let decoder = JSONDecoder()
let response = try decoder.decode(Rates.self, from: data)
response.rates
} catch let jsonError {
print(jsonError)
}
我試圖定義一個結構:
struct Rates: Codable, Hashable {
let rates: Point
}
struct Point {
}
但是我不知道應該寫什么,struct Point因為日期不是一個一致的欄位。
uj5u.com熱心網友回復:
這里有兩種可能的解決方案,一種使用結構Point,另一種使用字典
首先解決方案Point
struct Point: Codable {
let date: String
let rate: Double
}
然后創建一個自定義init(from:) ,我們首先將 json 解碼為一個字典,[String: [String: Double]]然后將該字典映射到一個陣列中Point
struct Rates: Codable {
let rates: [Point]
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
let dictionary = try container.decode([String: [String: Double]].self, forKey: .rates)
rates = dictionary.map { Point(date: $0.key, rate: $0.value.first?.value ?? .zero) }
}
}
這是使用字典的第二個解決方案
struct Rates: Codable {
let rates: [String: Double]
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
let dictionary = try container.decode([String: [String: Double]].self, forKey: .rates)
rates = dictionary.compactMapValues { $0.first?.value }
}
}
uj5u.com熱心網友回復:
struct Rates: Codable {
let rates: [String: Point]
}
// MARK: - Point
struct Point: Codable {
let eur: Double
enum CodingKeys: String, CodingKey {
case eur = "EUR"
}
}
你可以這樣做
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/536712.html
