Swift 解码这个简单的JSON结构不起作用

Swift 解码这个简单的JSON结构不起作用,swift,Swift,我有一个简单的模型,我定义它来解码一个结构。 但它在解码方面失败了。 谁能告诉我我做错了什么 struct Model: Codable { let firstName: String let lastName: String let age: Int enum Codingkeys: String, CodingKey { case firstName = "first_name" case lastName = "last_n

我有一个简单的模型,我定义它来解码一个结构。 但它在解码方面失败了。 谁能告诉我我做错了什么

struct Model: Codable {
    let firstName: String
    let lastName: String
    let age: Int

    enum Codingkeys: String, CodingKey {
        case firstName = "first_name"
        case lastName = "last_name"
        case age
    }
}


class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        let session = URLSession.shared
        let url = URL(string: "https://learnappmaking.com/ex/users.json")!
        let task = session.dataTask(with: url) { (data, response, error) in
            let decoder = JSONDecoder()
            let d = try! decoder.decode([Model].self, from: data!) //fails here
            print(d)
        }
        task.resume()
    }
}
我仔细检查了json是否正确,但仍然无法解码

显示错误

线程5:致命错误:“重试!”表达式意外引发错误: Swift.DecodingError.keyNotFound(编码键(stringValue:“firstName”), intValue:nil),Swift.DecodingError.Context(编码路径: [[u JSONKey(stringValue:“索引0”,intValue:0)],debugDescription:“否 与键编码键关联的值(stringValue:\“firstName\”, intValue:nil)(“firstName\”,underyingerror:nil))

它一直在搜索
firstName
,但我专门有一个枚举来检查
first\u name

这是JSON负载

[
  {
    "first_name": "Ford",
    "last_name": "Prefect",
    "age": 5000
  },
  {
    "first_name": "Zaphod",
    "last_name": "Beeblebrox",
    "age": 999
  },
  {
    "first_name": "Arthur",
    "last_name": "Dent",
    "age": 42
  },
  {
    "first_name": "Trillian",
    "last_name": "Astra",
    "age": 1234
  }
]

我知道我可以添加
decoder.keyDecodingStrategy=.convertFromSnakeCase
,但我想知道为什么现有代码不起作用?

代码是正确的,但显然您的模型存在一些问题(尽管
convertFromSnakeCase
确实起作用)

我重新键入了结构,错误消失了。请复制并粘贴这个

struct Model : Decodable {
    let firstName : String
    let lastName : String
    let age : Int

    private enum CodingKeys : String, CodingKey { case firstName  = "first_name", lastName  = "last_name", age }
}

有些值是可选的,为了安全起见,将all-let设置为可选,它肯定会工作

struct Model: Codable {
    let firstName: String?
    let lastName: String?
    let age: Int?

    enum Codingkeys: String, CodingKey {
        case firstName = "first_name"
        case lastName = "last_name"
        case age
    }
}

它起作用了!!这是虫子吗?从语法上讲,你重新编写的模型和我的模型没有区别,对吧?代码是不正确的:实际问题是一个打字错误,请参见我的上述评论。这只是一个简单的打字错误:
Codingkeys
应该是
Codingkeys
-\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu@MartinR谢谢…这不会解决问题,因为代码中有输入错误。枚举应该是
CodingKeys
而不是
CodingKeys