我在解析来自 NBP api“http://api.nbp.pl/api/exchangerates/tables/a/?format=json”的数据时遇到问题。我创建了结构 CurrencyDataStore 和 Currency
struct CurrencyDataStore: Codable {
var table: String
var no : String
var rates: [Currency]
enum CodingKeys: String, CodingKey {
case table
case no
case rates
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
table = ((try values.decodeIfPresent(String.self, forKey: .table)))!
no = (try values.decodeIfPresent(String.self, forKey: .no))!
rates = (try values.decodeIfPresent([Currency].self, forKey: .rates))!
} }
struct Currency: Codable {
var currency: String
var code: String
var mid: Double
enum CodingKeys: String, CodingKey {
case currency
case code
case mid
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
currency = try values.decode(String.self, forKey: .currency)
code = try values.decode(String.self, forKey: .code)
mid = try values.decode(Double.self, forKey: .mid)
}
}
在 controllerView 类中,我编写了 2 个方法来解析来自 API 的数据
func getLatestRates(){
guard let currencyUrl = URL(string: nbpApiUrl) else {
return
}
let request = URLRequest(url: currencyUrl)
let task = URLSession.shared.dataTask(with: request, completionHandler: { (data, response, error) -> Void in
if let error = error {
print(error)
return
}
if let data = data {
self.currencies = self.parseJsonData(data: data)
}
})
task.resume()
}
func parseJsonData(data: Data) -> [Currency] {
let decoder = JSONDecoder()
do{
let currencies = try decoder.decode([String:CurrencyDataStore].self, from: data)
}
catch {
print(error)
}
return currencies
}
此代码无效。我有这个错误“typeMismatch(Swift.Dictionary, Swift.DecodingError.Context(codingPath: [], debugDescription: “Expected to decode Dictionary but found an array instead.”, underlyingError: nil))”。
你能帮帮我吗?
最佳答案
该 API 返回的 JSON 为您提供了一个数组,而不是字典,但您告诉 JSONDecoder 需要一个字典类型。将该行更改为:
让 currencys = try decoder.decode([CurrencyDataStore].self, from: data)
关于json - Swift 解码嵌套的 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50957045/