当键上的类型不匹配时,使Swift JSONDecoder不会失败

时间:2019-06-28 18:08:44

标签: json swift decoder jsondecoder

我有一个像这样的简单结构:

struct Object: Codable {
    let year: Int?
    …
}

当解码JSON中的{ "year": 10, … }或不解码year时很好。
但是当JSON的键类型不同时,解码将失败:{ "year": "maybe string value" }

当Optional属性上的类型不匹配时,如何使解码过程失败?

谢谢。

1 个答案:

答案 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)
}

示例:

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