从JSON转换引号(Swift)

b1payxdu  于 2023-10-15  发布在  Swift
关注(0)|答案(2)|浏览(100)

我有一个类似于bellow的结构:

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
有没有什么方法,(除了为我到目前为止创建的每个结构编写自定义的可编码和可解码的实现)来解决这个问题?例如,在JSONDecoder()上执行操作

332nm8kg

332nm8kg1#

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

别忘了解码其他属性的值。

q1qsirdb

q1qsirdb2#

实际上,在JSON中将数字作为带引号的字符串发送并不罕见。虽然最好是请求后端将数字序列化为JSON数字,但客户端开发人员通常无法直接影响后端开发人员。以下是几种解决方案:
1.手动实现init(from: Decoder),如其他答案中所建议的。
1.使用属性 Package 器,例如@Quoted var int: Int?。请记住,使用decodeIfPresent扩展所有解码器容器类型作为属性 Package 器类型。
1.使用自定义的JSONDecoder实现。
1.利用可编码工具进行原生解码器,如CodableProxiesextensionsMetaCodable等。

相关问题