Swift Error- keyNotFound(CodingKeys(stringValue :, intValue:nil),Swift.DecodingError.Context,

问题描述 投票:0回答:1

[我正在尝试从此API JSON文件-[https://data.ct.gov/resource/rf3k-f8fg.json]中读取康涅狄格州冠状病毒数据(但我从表示keyNotFound(CodingKeys(stringValue:“ covid19TestsReported”,intValue:nil)的excode中得到此错误,Swift ..DecodingError.Context

但是,仅当我尝试访问文件的covid_19_tests_reported属性时才会出现此错误。

这是我的代码,有人可以告诉我我在做什么错。

import UIKit


class StateViewController: UIViewController {


@IBOutlet weak var testRatioLbl: UILabel!



override func viewDidLoad() {
    super.viewDidLoad()

    getData()

}

fileprivate func getData(){

    let url = URL(string: "https://data.ct.gov/resource/rf3k-f8fg.json")!
    URLSession.shared.dataTask(with: url){(data, response, error) in

        do {
            let decoder = JSONDecoder()
            decoder.keyDecodingStrategy = .convertFromSnakeCase
            let users = try decoder.decode([Users].self, from: data!)
            print(users)





        }
        catch {

            print(error)
        }


    }.resume()
}

  func didUpdatePrice(tests: String) {


    DispatchQueue.main.async {
    self.testRatioLbl.text = tests + " tests"

    }
}

func didFailWithError(error: Error) {
    print(error)
}

    }

    class Users: Decodable {

let covid19TestsReported: String
enum CodingKeys: String, CodingKey {
    case covid19TestsReported = "covid19TestsReported"

}
required init(from decoder:Decoder) throws {
    let values = try decoder.container(keyedBy: CodingKeys.self)
    covid19TestsReported = try values.decode(String.self, forKey: .covid19TestsReported)
}

}

ios swift uikit codable
1个回答
3
投票

更新您的班级。您的键值为“ covid_19_tests_reported”,而不是“ covid19TestsReported

因为在某些情况下此字段为空,所以使其为可选

 struct Users: Decodable {
    let covid19TestsReported: String?

  private  enum CodingKeys: String, CodingKey {
        case covid19TestsReported = "covid_19_tests_reported"

    }
}

也更新您的getData

 fileprivate func getData(){

        let url = URL(string: "https://data.ct.gov/resource/rf3k-f8fg.json")!
        URLSession.shared.dataTask(with: url){(data, response, error) in

            do {
                let decoder = JSONDecoder()
                let users = try decoder.decode([Users].self, from: data!)

                users.forEach { (user) in
                    if let cases = user.covid19TestsReported {
                    print(cases)
                    }
                }
            }
            catch {

                print(error)
            }


        }.resume()
    }
© www.soinside.com 2019 - 2024. All rights reserved.