网络响应中相同 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)
}
}
我的客户有一项服务 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)
}
}