我的客户端有一个返回文章对象的服务。有一个 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)
}
}