相关疑难解决方法(0)

Swift 4 JSON可解码最简单的解码类型更改方法

使用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)

但这是相反的方向,因为它迫使我为自己做这一切.

json swift swift4 codable

24
推荐指数
3
解决办法
1万
查看次数

JSONDecoder 原始类型的自定义初始化器

如何为primitiveInt、Bool 等类型自定义 JSONDecoder 的行为?

这是问题所在:

  • 类型不能依赖后端。例如:布尔可以是真/假或“真”/“假”(布尔可以用双引号括起来)

  • 我们至少有 300 个 Codable 结构,其中平均有 15 个属性,编写解码逻辑很麻烦。此外,逻辑或多或少保持不变,因此代码变得重复

因此,我正在寻找一个解决方案,如果有一个Type mismatch原始类型应该能够处理它,如果没有,那么它应该被设置为nil提供该类型是可选的。


我为此尝试了多种方法

1. 在所有原始类型上都有 Wrapper 并处理解码逻辑。以下是 Bool 上的包装器示例

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)

swift jsondecoder

2
推荐指数
1
解决办法
522
查看次数

标签 统计

swift ×2

codable ×1

json ×1

jsondecoder ×1

swift4 ×1