代码之家  ›  专栏  ›  技术社区  ›  swift nub

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

  •  -1
  • swift nub  · 技术社区  · 5 年前

    我有一个简单的模型,我定义它来解码一个结构。 但它无法解码。 有人能告诉我我做错了什么吗?

    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(编码路径: [_jsonkey(stringvalue:“index 0”,intvalue:0)],debugdescription:“no 与键编码键关联的值(stringvalue:\“firstname\”, intvalue:nil)(“firstname\”“)“,underlyingError:nil)

    它一直在寻找 firstName 但是我有一个枚举要检查 first_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 但是我想知道为什么现有的代码不能工作?

    1 回复  |  直到 5 年前
        1
  •  0
  •   vadian    5 年前

    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 }
    }