使 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)
}

示例:

  1. 如果JSON{ "year": "10"}object是:Object(year: nil)
  2. 如果JSON{ "year": 10}object是:Object(year: Optional(10))