我有一个如下所示的结构:
struct MyStruct: Codable {
var id: Int?
}
我从服务器收到的 JSON 是这样的:
{
"id": 12345
}
但是现在服务器端决定将所有数字作为引号发送,如下所示:
{
"id": "12345"
}
使用
JSONDecoder().decode
解码此 json 时出现错误,
The data couldn’t be read because it isn’t in the correct format
有什么办法(除了为我到目前为止创建的每个结构编写自定义的 Encodable 和 Decodable 实现)来解决这个问题?例如在
JSONDecoder()
上做某事
您可以通过实现 Decodable 协议所需的初始化程序 init(from:):
来做到这一点extension MyStruct {
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
let idString = try values.decode(String.self, forKey: .id)
id = Int(idString)
}
}
并且不要忘记解码其他属性的值。
实际上,在 JSON 中以带引号的字符串发送数字并不罕见。虽然最好请求后端将数字序列化为 JSON 数字,但客户端开发人员通常无法直接影响后端开发人员。以下是几种解决方案:
init(from: Decoder)
。@Quoted var int: Int?
。请记住使用 decodeIfPresent
扩展所有解码器容器类型作为您的属性包装类型。JSONDecoder
实现。