Swift 4 Codable - 布尔值或字符串值
Swift 4 Codable - Bool or String values
正在寻找一些关于如何处理我最近 运行 遇到的情况的意见。
我一直在使用 Swift 4s Codable 并取得成功,但今天发现了一个我没有预料到的崩溃。我正在使用的 API 表示 returns 一个 boolean
键 manage_stock
.
我的存根结构看起来像:
struct Product: Codable {
var manage_stock: Bool?
}
很好用,问题是 API 有时 returns 是 string
而不是 boolean
。
因此,我的解码失败了:
Expected to decode Bool but found a string/data instead.
字符串只等于 "parent"
我希望它等于 false
.
我也可以将我的结构更改为 var manage_stock: String?
,如果这样可以更轻松地从 API 中获取 JSON 数据。但是当然,如果我改变它,我的错误就会变成:
Expected to decode String but found a number instead.
是否有一种简单的方法来处理这种突变,或者我是否需要失去 Codable
为 table 带来的所有自动化并实现我自己的 init(decoder: Decoder)
.
干杯
由于您无法始终控制所使用的 API,因此可以通过覆盖 init(from:)
:[=14= 直接使用 Codable
解决此问题的一种简单方法]
struct Product : Decodable {
// Properties in Swift are camelCased. You can provide the key separately from the property.
var manageStock: Bool?
private enum CodingKeys : String, CodingKey {
case manageStock = "manage_stock"
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
do {
self.manageStock = try container.decodeIfPresent(Bool.self, forKey: .manageStock)
} catch DecodingError.typeMismatch {
// There was something for the "manage_stock" key, but it wasn't a boolean value. Try a string.
if let string = try container.decodeIfPresent(String.self, forKey: .manageStock) {
// Can check for "parent" specifically if you want.
self.manageStock = false
}
}
}
}
有关这方面的更多信息,请参阅 Encoding and Decoding Custom Types。
正在寻找一些关于如何处理我最近 运行 遇到的情况的意见。
我一直在使用 Swift 4s Codable 并取得成功,但今天发现了一个我没有预料到的崩溃。我正在使用的 API 表示 returns 一个 boolean
键 manage_stock
.
我的存根结构看起来像:
struct Product: Codable {
var manage_stock: Bool?
}
很好用,问题是 API 有时 returns 是 string
而不是 boolean
。
因此,我的解码失败了:
Expected to decode Bool but found a string/data instead.
字符串只等于 "parent"
我希望它等于 false
.
我也可以将我的结构更改为 var manage_stock: String?
,如果这样可以更轻松地从 API 中获取 JSON 数据。但是当然,如果我改变它,我的错误就会变成:
Expected to decode String but found a number instead.
是否有一种简单的方法来处理这种突变,或者我是否需要失去 Codable
为 table 带来的所有自动化并实现我自己的 init(decoder: Decoder)
.
干杯
由于您无法始终控制所使用的 API,因此可以通过覆盖 init(from:)
:[=14= 直接使用 Codable
解决此问题的一种简单方法]
struct Product : Decodable {
// Properties in Swift are camelCased. You can provide the key separately from the property.
var manageStock: Bool?
private enum CodingKeys : String, CodingKey {
case manageStock = "manage_stock"
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
do {
self.manageStock = try container.decodeIfPresent(Bool.self, forKey: .manageStock)
} catch DecodingError.typeMismatch {
// There was something for the "manage_stock" key, but it wasn't a boolean value. Try a string.
if let string = try container.decodeIfPresent(String.self, forKey: .manageStock) {
// Can check for "parent" specifically if you want.
self.manageStock = false
}
}
}
}
有关这方面的更多信息,请参阅 Encoding and Decoding Custom Types。