【问题标题】:What parsing object when property can be integer or bool?当属性可以是整数或布尔值时,什么解析对象?
【发布时间】:2018-05-21 18:34:50
【问题描述】:

有时服务器会向我发送布尔属性(真、假)。 有时服务器会将属性作为整数 (0,1) 发送给我。

如何通过 Swift 4 中的标准 Decodable 解码这种情况?

示例。 我有:

final class MyOffer : Codable {
    var id = 0
    var pickupAsap: Int?

    enum CodingKeys: String, CodingKey {
         case id
         case pickupAsap = "pickup_asap"
    }
}

来自服务器的响应是:

1) “pickup_all_day”:是的,

2) “pickup_all_day”:0

【问题讨论】:

标签: json parsing boolean swift4 jsondecoder


【解决方案1】:

您可以实现自己的 decode init 方法,从 decode 容器中获取每个类属性,在本节中,让您的逻辑处理“asap”是 Int 还是 Bool,最后对所有必需的类属性进行签名。

这是我做的一个简单的演示:

class Demo: Decodable {
    var id = 0
    var pickupAsap: Int?

    enum CodingKeys: String, CodingKey {
        case id
        case pickupAsap = "pickup_asap"
    }

    required init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        let id = try container.decode(Int.self, forKey: .id)
        let pickupAsapBool = try? container.decode(Bool.self, forKey: .pickupAsap)
        let pickupAsapInt = try? container.decode(Int.self, forKey: .pickupAsap)
        self.pickupAsap = pickupAsapInt ?? (pickupAsapBool! ? 1 : 0)
        self.id = id
    }
}

模拟数据:

 let jsonInt = """
{"id": 10,
 "pickup_asap": 0
}
""".data(using: .utf8)!

let jsonBool = """
{"id": 10,
 "pickup_asap": true
}
""".data(using: .utf8)!

测试:

let jsonDecoder = JSONDecoder()
let result = try! jsonDecoder.decode(Demo.self, from: jsonInt)
print("asap with Int: \(result.pickupAsap)")

let result2 = try! jsonDecoder.decode(Demo.self, from: jsonBool)
print("asap with Bool: \(result2.pickupAsap)")

输出:

asap with Int: Optional(0)
asap with Bool: Optional(1)

更多信息:Apple's encoding and decoding doc

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-07
    • 1970-01-01
    • 2017-06-22
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多