我正在尝试使用 Alamofire
和 SwiftyJSON
将 JSON
字典数组加载到一个带有 swift 的对象中,但是当下载数据时,我收到错误:
keyNotFound(CodingKeys(stringValue: "inProrgresss", intValue: nil(, Swift.DecodingError.Context(codingPath: [], debugDescription: "No value associated with key CodingKeys(stringValue: \"inProrgresss\", intValue: nil( (\"inProrgresss\"(.", underlyingError: nil((.
本地化描述只是说数据丢失。 我的JSON在这里,我的代码是这样的:
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 转换为数据类型很陌生,我在这里找不到任何有用的东西。
请阅读 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)
}
}
}