我在解析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:“预期对Dictionary进行解码,但找到了一个数组。”,底层错误:nil))”。
你能帮我吗?
答案 0 :(得分:1)
该API返回的JSON给您一个数组,而不是字典,但是您要告诉JSONDecoder期望字典类型。将该行更改为:
let currencies = try decoder.decode([CurrencyDataStore].self, from: data)