我有一个像这样的简单结构:
struct Object: Codable {
let year: Int?
…
}
当解码JSON中的{ "year": 10, … }
或不解码year
时很好。
但是当JSON的键类型不同时,解码将失败:{ "year": "maybe string value" }
当Optional属性上的类型不匹配时,如何使解码过程失败?
谢谢。
答案 0 :(得分:1)
在init(from:)
中实施struct Object
。创建enum CodingKeys
并为要解析的所有cases
添加properties
。
在init(from:)
中,手动解析keys
,并检查是否可以将year
中的JSON
解码为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)
}
示例:
{ "year": "10"}
,则 object
为:Object(year: nil)
{ "year": 10}
,则object
为:Object(year: Optional(10))