我正在尝试使用JSON
和Alamofire
将SwiftyJSON
字典数组快速加载到对象中,但是下载数据时出现错误:
keyNotFound(CodingKeys(stringValue:“ inProrgresss”,intValue:nil),Swift.DecodingError.Context(codingPath:[],debugDescription:“没有与键CodingKeys相关联的值(stringValue:\” inProrgresss \“,intValue:nil )(\“ inProrgresss \”)。“,underlyingError:nil))。
本地化描述仅表示数据丢失。我的JSON是here,我的代码是这样的:
struct CompData: Codable {
let inProrgresss: [[String: String]]
let past: [[String: String]]
let upcoming: [[String: String]]
}
func getData(url: URLConvertible) {
SVProgressHUD.show()
Alamofire.request(url).responseJSON { (dataResponse) in
if dataResponse.result.value != nil {
SVProgressHUD.dismiss()
let JSONVar = JSON(dataResponse.result.value)
let data = Data(dataResponse.data!)
print(data)
let decoder = JSONDecoder()
do {
let newData = try decoder.decode(CompData.self, from: data)
print("NEWDATA \(newData)")
} catch {
print(error)
}
print(JSONVar)
}
}
}
对于将JSON转换为数据类型我还很陌生,在这里我找不到任何有帮助的东西。
答案 0 :(得分:4)
请阅读 JSON。没有密钥inProrgresss
。
并为字典创建一个结构,这非常简单
struct CompData: Decodable {
let inProgress: [Location]?
let past: [Location]
let upcoming: [Location]
}
struct Location : Decodable {
let city, countryCode, name, date, country, id : String
}
并声明inProgress
为可选,因为数组为空。
修改:
getData
中有很多冗余代码。这样更有效。 convertFromSnakeCase
做到了。
func getData(url: URLConvertible) {
SVProgressHUD.show()
Alamofire.request(url).responseData { (response) in
SVProgressHUD.dismiss()
switch response.result {
case .success(let data):
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
do {
let result = try decoder.decode(CompData.self, from: data)
print("NEWDATA \(result)")
} catch {
print(error)
}
case .failure(let error): print(error)
}
}
}