首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >数据缺少JSONDecoder

数据缺少JSONDecoder
EN

Stack Overflow用户
提问于 2019-05-29 03:09:53
回答 1查看 145关注 0票数 0

我尝试使用AlamofireSwiftyJSON通过swift将JSON字典数组加载到对象中,但在下载数据时,我收到错误消息:

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转换为数据类型方面,我是个新手,在这里我找不到任何有用的东西。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-29 03:15:13

请阅读 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)
        }
    }
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56348666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档