网络响应中相同 json 对象的不同密钥类型

Different key type for the same json object in network response

我的客户有一项服务 returns 文章对象。有一个id属性是UInt64类型的。在同一个 api 中,当您请求类别文章时,您会得到包含文章的响应,但 id 是一个字符串。目前没有人会改变这个愚蠢的事情,所以我必须找到一个解决方法来解析这两个答案。我的模型是这样的:

struct Article {
  let id: UInt64
  let categoryName: String?
}

extension Article: Decodable {
  private enum Keys: String, CodingKey {
    case id
    case categoryName
}

init(from decoder: Decoder) throws {
    let container = try decoder.container(keyedBy: Keys.self)

    id = try container.decode(UInt64.self, forKey: Keys.id)
    categoryName = try container.decodeIfPresent(String.self, forKey: Keys.categoryName)
}

如何查看Keys.id的类型并使用正确的方法解码? 我必须同时使用两者

   id = try container.decode(UInt64.self, forKey: Keys.id)
   id = try container.decode(String.self, forKey: Keys.id) 

在这两种情况下都能正确解析我的对象。提前致谢

如果您需要解决方法,请按照以下答案进行操作。我不知道这是否也是一种可能的好方法。期待改进这个答案。欢迎提出建议。

extension Article: Decodable {
private enum Keys: String, CodingKey {
    case id
    case categoryName
}

init(from decoder: Decoder) throws {
    let container = try decoder.container(keyedBy: Keys.self)
    // check if id is of type UInt64
    do{
        id = try container.decodeIfPresent(UInt64.self, forKey: Keys.id) ?? 0

    }catch{
        // if id is of String type convert it to UInt64
        // do catch can be used here too
        let str = try container.decodeIfPresent(String.self, forKey: Keys.id)
        id = UInt64(str ?? "0") ?? 0

    }
    categoryName = try container.decode(String.self, forKey: Keys.categoryName)

}
}