如何确保所有 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)
}
让我们想象一下第三方 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)
}