数据缺少JSONDecoder

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (17)

我试图加载的数组JSON使用字典与快速的对象AlamofireSwiftyJSON,但数据被下载的时候,我得到的错误:

keyNotFound(CodingKeys(stringValue:“inProrgresss”,intValue:nil),Swift.DecodingError.Context(codingPath:[],debugDescription:“没有与键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)
        }
    }
}

扫码关注云+社区

领取腾讯云代金券