当键上的类型不匹配时,确保Swift JSONDecoder不会失败
我有一个这样的简单结构:当键上的类型不匹配时,确保Swift JSONDecoder不会失败,json,swift,decoder,jsondecoder,Json,Swift,Decoder,Jsondecoder,我有一个这样的简单结构: struct Object: Codable { let year: Int? … } 在JSON中解码类似于{“year”:10,…}或无year的JSON时是可以的。 但当JSON在键上具有不同类型时,解码将失败:{“year”:“maybe string value”} 当可选属性上的类型不匹配时,如何使解码过程不失败 谢谢。在struct对象中实现init(from:)。创建enum CodingKeys并为所有要分析的属性添加案例 在init
struct Object: Codable {
let year: Int?
…
}
在JSON中解码类似于{“year”:10,…}
或无year
的JSON时是可以的。但当JSON在键上具有不同类型时,解码将失败:
{“year”:“maybe string value”}
当可选属性上的类型不匹配时,如何使解码过程不失败
谢谢。在struct对象中实现init(from:)
。创建enum CodingKeys
并为所有要分析的属性添加案例
在init(from:)
中手动解析键
,检查JSON
中的year
是否可以解码为Int
。如果是,则将其指定给对象的
年
属性,否则不指定
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”}
,对象是:对象(year:nil)
如果JSON是{“年”:10}
,对象是:对象(年:可选(10))
我可以自定义JSONDecoder来实现这一点,但不能自定义可编码结构吗?实现所有这样的事情都很痛苦。是的,就是这样。您最好更改API响应以返回键的一致类型。没有其他方法可以处理这个问题。您无法为这种实现定制JSONDecoder。我使用脚本桥通过Apple事件与其他Mac应用程序通信。因此,我不能改变回应。面对面,我应该断言,来自另一方的所有反应在某些时候都会改变。但变化不大就可以了。这是用户期望的。谢谢您的回复。我希望苹果会改进解码器,为我们提供更多的定制选项。