使用swift4的Codable协议,有很多级别的引擎日期和数据转换策略.
鉴于JSON:
{
"name": "Bob",
"age": 25,
"tax_rate": "4.25"
}
Run Code Online (Sandbox Code Playgroud)
我想将它强制进入以下结构
struct ExampleJson: Decodable {
var name: String
var age: Int
var taxRate: Float
enum CodingKeys: String, CodingKey {
case name, age
case taxRate = "tax_rate"
}
}
Run Code Online (Sandbox Code Playgroud)
日期解码策略可以将基于字符串的日期转换为日期.
基于String的Float是否有某种功能
否则我一直坚持使用CodingKey引入一个String并使用计算得到:
enum CodingKeys: String, CodingKey {
case name, age
case sTaxRate = "tax_rate"
}
var sTaxRate: String
var taxRate: Float { return Float(sTaxRate) ?? 0.0 }
Run Code Online (Sandbox Code Playgroud)
这种方式比我看起来需要更多的维护.
这是最简单的方式还是类似于DateDecodingStrategy用于其他类型的转换?
更新:我应该注意:我也走了超越的路线
init(from decoder:Decoder)
Run Code Online (Sandbox Code Playgroud)
但这是相反的方向,因为它迫使我为自己做这一切.
如何为primitiveInt、Bool 等类型自定义 JSONDecoder 的行为?
这是问题所在:
类型不能依赖后端。例如:布尔可以是真/假或“真”/“假”(布尔可以用双引号括起来)
我们至少有 300 个 Codable 结构,其中平均有 15 个属性,编写解码逻辑很麻烦。此外,逻辑或多或少保持不变,因此代码变得重复
因此,我正在寻找一个解决方案,如果有一个Type mismatch原始类型应该能够处理它,如果没有,那么它应该被设置为nil提供该类型是可选的。
struct Bool1: Codable{
private var bool: Bool?
public init(from decoder: Decoder) throws {
let container = try decoder.singleValueContainer()
if let b = try? container.decode(Bool.self) {
self.bool = b
} else if let string = try? container.decode(String.self) {
if string.lowercased() == "true" {
self.bool = true
} else if string.lowercased() == "false" { …Run Code Online (Sandbox Code Playgroud)