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

时间:2020-05-14 13:19:00

标签: ios swift uikit codable

我正在尝试从此API JSON文件-“ https://data.ct.gov/resource/rf3k-f8fg.json”中读取康涅狄格州冠状病毒数据(但我从表示keyNotFound(CodingKeys(stringValue:“ covid19TestsReported”,intValue:nil ),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)
}

}

1 个答案:

答案 0 :(得分: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()
    }
相关问题