Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当键上的类型不匹配时,确保Swift JSONDecoder不会失败_Json_Swift_Decoder_Jsondecoder - Fatal编程技术网

当键上的类型不匹配时,确保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应用程序通信。因此,我不能改变回应。面对面,我应该断言,来自另一方的所有反应在某些时候都会改变。但变化不大就可以了。这是用户期望的。谢谢您的回复。我希望苹果会改进解码器,为我们提供更多的定制选项。