使 Swift JSONDecoder 在键类型不匹配时不会失败
Make Swift JSONDecoder not fail when type on key not match
我有一个这样的简单结构:
struct Object: Codable {
let year: Int?
…
}
在 JSON 中像 { "year": 10, … }
或没有 year
一样解码 JSON 时没问题。
但当 JSON 的键类型不同时解码失败:{ "year": "maybe string value" }
当可选 属性 上的类型不匹配时,我如何才能不使解码过程失败?
谢谢。
在 struct Object
中实施 init(from:)
。创建 enum CodingKeys
并为所有要解析的 properties
添加 cases
。
在 init(from:)
中手动解析 keys
并检查 JSON
中的 year
是否可以解码为 Int
。如果是,则将其分配给 Object's
year
属性 否则不分配。
struct Object: Codable {
var year: Int?
enum CodingKeys: String,CodingKey {
case year
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
if let yr = try? values.decodeIfPresent(Int.self, forKey: .year) {
year = yr
}
}
}
解析 JSON 响应,例如,
do {
let object = try JSONDecoder().decode(Object.self, from: data)
print(object)
} catch {
print(error)
}
示例:
- 如果JSON是
{ "year": "10"}
,object
是:Object(year: nil)
- 如果JSON是
{ "year": 10}
,object
是:Object(year: Optional(10))
我有一个这样的简单结构:
struct Object: Codable {
let year: Int?
…
}
在 JSON 中像 { "year": 10, … }
或没有 year
一样解码 JSON 时没问题。
但当 JSON 的键类型不同时解码失败:{ "year": "maybe string value" }
当可选 属性 上的类型不匹配时,我如何才能不使解码过程失败?
谢谢。
在 struct Object
中实施 init(from:)
。创建 enum CodingKeys
并为所有要解析的 properties
添加 cases
。
在 init(from:)
中手动解析 keys
并检查 JSON
中的 year
是否可以解码为 Int
。如果是,则将其分配给 Object's
year
属性 否则不分配。
struct Object: Codable {
var year: Int?
enum CodingKeys: String,CodingKey {
case year
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
if let yr = try? values.decodeIfPresent(Int.self, forKey: .year) {
year = yr
}
}
}
解析 JSON 响应,例如,
do {
let object = try JSONDecoder().decode(Object.self, from: data)
print(object)
} catch {
print(error)
}
示例:
- 如果JSON是
{ "year": "10"}
,object
是:Object(year: nil)
- 如果JSON是
{ "year": 10}
,object
是:Object(year: Optional(10))