【发布时间】:2021-10-10 00:15:41
【问题描述】:
编辑 2:
在更改模型结构并在没有完成处理程序的情况下调用 JSON 解码器后,我设法让它工作。谢谢大家的帮助。
固定代码:
型号
import Foundation
struct RatesResponse: Decodable, Hashable{
let rates: [String: Double]
}
解码器类
import Foundation
class RatesModelData{
public var rateCurrency = [String]()
public var rateValue = [Double]()
public func getRates(currency: String){
guard let url = URL(string: "https://api.exchangerate.host/latest?base=\(currency)")
else {
print("URL is invalid")
return
}
var request = URLRequest(url: url)
let dataTask = URLSession.shared.dataTask(with: request){data, response, error in
if let data = data {
do{
let ratesResponse = try JSONDecoder().decode(RatesResponse.self, from: data)
for rate in ratesResponse.rates{
self.rateCurrency.append(rate.key)
self.rateValue.append(rate.value)
}
print(self.rateCurrency)
} catch {
print(error)
}
}
}
dataTask.resume()
}
}
编辑:
我已将 let rate = Rates 更改为 let rates = Rates,将解码器类修改为以下内容并添加了 do/catch 语句,但是我现在收到错误“给定的数据是无效的 JSON”。我也更新了代码 sn-ps。
我有这个 json 模型:
https://api.exchangerate.host/latest?base=usd
我终其一生都无法弄清楚如何正确解码它。我知道它是一本字典,因此必须对其进行解码,但我正在努力解决我做错的事情。
型号:
struct RatesResponse: Decodable, Hashable{
let rates : Rates
}
struct Rates: Decodable, Hashable {
let rates: [String: Double]
}
解码器类:
class RatesModelData{
public func getRates(currency: String, _ completionHandler: @escaping(Rates) -> Void){
guard let url = URL(string: "https://api.exchangerate.host/latest?base=\(currency)")
else {
print("URL is invalid")
return
}
var request = URLRequest(url: url)
request.httpMethod = "GET"
request.setValue("application/json", forHTTPHeaderField: "ACCEPT")
let dataTask = URLSession.shared.dataTask(with: request){data, response, error in
do{
if let data = data {
if let ratesResponse = try JSONDecoder().decode(RatesResponse?.self, from: data){
completionHandler(ratesResponse.rates)
}
return
}
guard let httpResponse = response as? HTTPURLResponse, (200...299).contains(httpResponse.statusCode) else{
print("Error with response: \(response)")
return
}
if let error = error {
print("Error Thrown : \(error)")
return
}
} catch {
print(error)
}
}
dataTask.resume()
}
}
理想情况下,我希望将其显示在列表视图 (SwiftUI) 中,但现在只是就我的解码出错的地方寻求一些建议。
【问题讨论】:
-
让利率:利率 -> 让利率:利率
-
首先,告诉我您在哪里找到了该示例代码,因为使用
try ?进行 JSON 解码的人需要好好谈谈。使用do/try/catch并打印结果错误,你会看到出了什么问题,即json 有rates而你有rate -
我在实施您的建议后编辑了我的帖子,但我收到一条错误消息,说我的 json 无效,我是否错误地声明了我的模型?
-
你想要
decode(RatesResponse.self, from: data)- 你不能解码一个可选的。 -
照顾更简单的键(成功、基数、日期),首先,看看你是否能读懂它们。