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