如何确保所有 JSON 字段都显示在 Swift 可解码模型中?

How to make sure that all JSON fields are presented in a Swift Decodable model?

让我们想象一下第三方 JSON API 返回这样的模型:

{
  "key1": "Hello"
}

所以我们描述如下:

struct Model: Codable {
  var key1: String
}

最终 JSON 模型获得了一个新字段…

{
  "key1": "Hello",
  "key2": {
    "key3": "World"
  }
}

…旧的 Model 仍然有效,但它错过了新的 属性 key2.

有什么方法可以验证 所有 JSON 密钥是否出现在可解码模型中?

这是一种方法,通过使用 JSONSerialization 获取 json 消息中的所有键,然后使用反射 [= 将它们与解析数据中的键进行比较12=]

此代码仅比较计数,更彻底的检查应该验证每个单独的密钥

do {
    let dictionary = try JSONSerialization.jsonObject(with: data) as? [String: Any]
    let result = try JSONDecoder().decode(Model.self, from: data)
    if let keys = dictionary?.keys {
        let mirror = Mirror(reflecting: result)
        if keys.count != mirror.children.count {
            print("Wrong number of keys") 
            //throw SomeError 
        } 
    }
    //handle result 
} catch {
    print(error)
}