【问题标题】:Data missing JSONDecoder数据缺失 JSONDecoder
【发布时间】:2019-05-28 19:09:53
【问题描述】:

我正在尝试使用AlamofireSwiftyJSONJSON 字典数组快速加载到一个对象中,但是当下载数据时,我得到了错误:

keyNotFound(CodingKeys(stringValue: "inProrgresss", intValue: nil), Swift.DecodingError.Context(codingPath: [], debugDescription: "No value associated with key CodingKeys(stringValue: \"inProrgresss\", intValue: nil ) (\"inProrgresss\").", basedError: 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 转换为数据类型还很陌生,我在这里找不到任何有用的东西。

【问题讨论】:

    标签: json swift alamofire decodable jsondecoder


    【解决方案1】:

    阅读 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)
            }
        }
    }
    

    【讨论】:

    • 哦,是的...但是现在将其转换为字典数组,还是我需要做其他任何事情?
    • 可以,但是为其他字典创建结构更方便
    • 好的 - 所以只需重复 struct 的事情,它会自动完成,还是我需要更改 getData 代码?
    猜你喜欢
    • 1970-01-01
    • 2022-01-05
    • 2020-09-19
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    • 2014-06-21
    • 2021-01-07
    相关资源
    最近更新 更多