从 JSON 转换引用数字(swift)

问题描述 投票:0回答:2

我有一个如下所示的结构:

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()

上做某事
ios json swift json-deserialization jsondecoder
2个回答
0
投票

您可以通过实现 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)
    }
}

并且不要忘记解码其他属性的值。


0
投票

实际上,在 JSON 中以带引号的字符串发送数字并不罕见。虽然最好请求后端将数字序列化为 JSON 数字,但客户端开发人员通常无法直接影响后端开发人员。以下是几种解决方案:

  1. 按照其他答案中的建议手动实现
    init(from: Decoder)
  2. 使用属性包装器,例如
    @Quoted var int: Int?
    。请记住使用
    decodeIfPresent
    扩展所有解码器容器类型作为您的属性包装类型。
  3. 采用自定义
    JSONDecoder
    实现。
  4. 利用原生解码器的可编码工具,例如 CodableProxiesextensionsMetaCodable 等。
© www.soinside.com 2019 - 2024. All rights reserved.