如何解码众多 Decodable Swift 中的单个异常属性?

2023-11-29

我有一个符合 Decodable 的结构。它有 50 个 String 属性,只有 1 个 Bool 属性。该布尔值来自服务器,如字符串“false”/“true”或有时如整数 0/1,因此无法从框中解码。我怎样才能让它解码而不是对所有 50 个字符串属性编写大量的手动解码?也许以某种方式覆盖Bool的decodeIfPresent,但我无法让它工作。 我怎样才能避免创建 init 并手动解码所有内容并只处理那个 Bool ?如果可能的话,没有计算属性。

struct Response: Decodable {
    var s1: String
    var s2: String
    var s3: String
    //...........
    var s50: String
    var b1: Bool
    var b2: Bool
}

这是 json 示例:

{
    "s1":"string"
    "s2":"string"
    "s3":"string"
    //..........
    "s50":"string"
    "b1":"true"
    "b2":"0"
}

尝试过这个但不起作用(((

extension KeyedDecodingContainer { //Doesn't work, no execution
    func decodeIfPresent(_ type: Bool.Type, forKey key: K) throws -> Bool {
        return try! self.decodeIfPresent(Bool.self, forKey: key)
    }
    func decodeIfPresent(_ type: Bool.Type, forKey key: K) throws -> Bool? {
        return try? self.decodeIfPresent(Bool.self, forKey: key)
    }
}

解决此问题的一种方法是编写一个处理自定义解码的属性包装器,如下所示:

@propertyWrapper
struct FunnyBool: Decodable {
    var wrappedValue: Bool

    init(from decoder: Decoder) throws {
        let container = try decoder.singleValueContainer()
        if let value = try? container.decode(Bool.self) {
            wrappedValue = value
        }
        else if
            let string = try? container.decode(String.self),
            let value = Bool(string)
        {
            wrappedValue = value
        }
        else if
            let int = try? container.decode(Int.self),
            let value = int == 0 ? false : int == 1 ? true : nil
        {
            wrappedValue = value
        }
        else {
            // Default...
            wrappedValue = false
        }
    }
}

像这样使用它:

struct Response: Decodable {
    var s1: String
    var s2: String
    @FunnyBool var b: Bool
}

let json = #"{ "s1": "hello", "s2": "world", "b": 1 }"#
let response = try! JSONDecoder().decode(Response.self, from: json.data(using: .utf8)!)
dump(response)

游乐场输出:

▿ __lldb_expr_11.Response
  - s1: "hello"
  - s2: "world"
  ▿ _b: __lldb_expr_11.FunnyBool
    - wrappedValue: true
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何解码众多 Decodable Swift 中的单个异常属性? 的相关文章

  • Struts2 中有多种结果类型?

    我有一个使用 Tiles 的 Struts2 应用程序 如何在操作映射中获取多种结果类型 因为我需要将de输出设置为JSON数据 并且同时Tiles 我努力了
  • GM 发布 Xcode 6 编译

    我刚刚下载了 Xcode 6 的 GM 版本 但无法编译并出现以下错误 Command Applications Xcode app Contents Developer Toolchains XcodeDefault xctoolchai
  • 如何在 Swift 泛型中说“同一类”

    如果 Swift 泛型类型约束是协议名称 我可以要求受该协议约束的两种类型为同一类型 例如 protocol Flier struct Bird Flier struct Insect Flier func flockTwoTogether
  • 如何在 Angular 2 karma jasmine 测试中从 JSON 文件加载模拟数据?

    我在写信业力茉莉花测试用例角2 我们遇到了在单独的 JSON 文件中模拟数据的需求 因为数据很大 希望确保代码整洁 为此我进行了很多搜索但没有找到合适的解决方案 我们已经使用以下方式模拟 HTTP 服务模拟后端 所以我们不能使用Angula
  • 是否可以在 Swift 中交错 WebView 和 CALayerViews

    我有一个充当多个 CAShapeLayers 容器的视图 它们包含在屏幕上形成组合的贝塞尔曲线 用户可以通过不同的方式管理线宽 颜色 形状填充 不透明度等 我想通过占据相同容器的 WebView 引入文本 诀窍是 理想情况下我希望能够控制每
  • BigQuery 如何获取 JSON 结构中的值的总和?

    我有以下查询 SELECT JSON EXTRACT json Weights as weight from select Weights blue 1 0 purple 0 0 yellow 1 0 green 1 0 as json 返
  • Admob 广告无法快速显示

    您好 我正在尝试将 admob 广告添加到已使用 swift 上传到应用商店的应用程序中 我在 admob 中制作了一个应用程序并复制了 appid 和广告 id 并显示了各自的横幅广告和插页式广告 这里的问题是当我写这行时 request
  • 核心数据:重命名属性,而不会导致用户及其当前数据出现问题

    我只想为我的应用程序的新版本重命名并在表上添加属性 并且如果应用程序已安装 我想保留数据 首先我只是设置选项 let options NSMigratePersistentStoresAutomaticallyOption true NSI
  • .showsPhysics 内存泄漏

    我最近花了 5 个小时尝试调试 Spritekit 应用程序中的内存泄漏 应用程序启动后 我注意到内存使用量略有上升 我花了 5 个小时中的 3 个小时挖掘参考资料 了解强与弱的关系ARC https developer apple com
  • 在Unity游戏中保存数据的最佳方法[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想知道 在 Unity 游戏中保存数据的最佳方式是什么 JSON 如果是这样 怎么办 谢谢 以下是一些不同的方式和方法保存 Unit
  • 在 Django 模板中通过键访问字典

    我正在将字典从我的视图传递到模板 所以 key1 value1 key2 value2 传入并循环键 值对很好 但是我还没有找到从特定键直接在视图中访问的优雅解决方案 例如 key1 例如 bu json items key1 我可以使用一
  • 解析“流”JSON

    我在浏览器中有一个网格 我想通过 JSON 将数据行发送到网格 但浏览器应该在接收到 JSON 时不断解析它 并在解析时将行添加到网格中 换句话说 在接收到整个 JSON 对象后 不应将行全部添加到网格中 应该在接收到行时将其添加到网格中
  • R:将 JSON 时间格式转换为 POSIX

    我有一个 JSON 字符串 并将其放入数据框中 我能够做到这一点 但我在使用 apply 函数之一将所有时间字符串转换为 POSIX 格式时遇到问题 See here https stackoverflow com questions 90
  • AVAssetExportSession 无法导出从 iCloud 下载的视频

    我正在尝试创建从用户相册中选择的视频的缩小版本 输出的最大尺寸为 720p 因此 在检索视频时 我使用 mediumQualityFormat as the deliveryMode 如果用户设备中不存在原始视频或其中等质量版本 这会导致
  • dapper 可以反序列化存储为文本的 json 吗?

    public class MyType public int Id get set public int MyArray get set var sql SELECT id MyArrayAsJson as MyArray var x aw
  • ReactiveCocoa 将 SignalProducers 合二为一

    我正在使用 ReactiveCocoa 并且我有几个 SignalProducers let center NSNotificationCenter defaultCenter let signalProducer1 center rac
  • “预期的 ';'在 Swift 下的顶级声明符之后”

    我正在尝试将所有颜色设置在一个 Swift 文件中 该文件可以在我的整个应用程序中使用 下面的代码会导致 import Foundation import UIKit class DotColors let tsblueColor UICo
  • 如何使用 RX 应用宽限时间?

    我有一个Observable
  • 在 Swift 中从 Parse 加载图像

    我成功地将数据从 Parse 提取到 swift 中 但我的图像似乎没有按照我的方式工作 在我的 cellForRowAtIndexPath 方法中 我执行以下操作 var event AnyObject eventContainerArr
  • JSON:TypeError:Decimal('34.3')不是JSON可序列化的[重复]

    这个问题在这里已经有答案了 我正在运行一个 SQL 查询 它返回一个小数列表 当我尝试将其转换为 JSON 时 出现类型错误 查询 res db execute SELECT CAST SUM r SalesVolume 1000 0 AS

随机推荐

  • 如何将两个打包的 64 位四字加载到 128 位 xmm 寄存器中

    我有两个 UInt64 即 64 位四字 整数 它们与 8 字节对齐 sizeof UInt64 边界 如果这对任何事情有用的话 我也可以将它们对齐到 16 字节 它们被挤在一起 所以它们在内存中是并排的 我如何将它们加载到 xmm 寄存器
  • substr() 未按预期工作

    我只是想提取日期year month and day分开 以便我可以按照我的意愿使用它 我将当前日期存储在 today并使用substr 从中提取字符串 但我从我所做的事情中得到了一些奇怪的行为 我当前的代码 today date Y m
  • iOS 自定义导航栏后退按钮标题在点击时消失

    你好 StackOverflow 社区 我有一个相当奇怪的情况 导航控制器的导航栏上的自定义后退按钮在交互时消失 一些附加信息是我的代码没有使用 Storyboard 而是使用 UIKit 包括 UI 在内的所有内容都是以编程方式构建的 这
  • 如何在另一种方法中使用一种方法的“返回”值

    我目前正在开发这个玩高低骰子游戏的项目 我被困在如何使用返回的char from getHighLow和返回的int from getBet and getRoll in determineWinnings 这是我目前学习 Java 的第一
  • 如何在软件中模拟浮点运算? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 当CPU没有 或有问题 浮点单元时 软件如何执行浮点运算 例如 PIC AVR 和 8051 微控制器架构 效仿 在 PIC AVR 和 8051 上下文中 浮点 是错误的术语
  • 确保字符串文字联合属于对象的键

    export type A a b c const obj a 4 b 5 c 6 d 7 我如何确保所有元素A是对象的键obj 根据您的需要 您可以自动构造您的类型 所有键作为一个类型 您可以使用keyof将所有密钥作为一个联合体 自从k
  • 如何根据 Javascript 中的多个键对对象数组进行分组?

    我的数组如下 WarehouseId 1 ShippingCarrierId 1 PostalCodeType ShipToCustomer TimeStart 1970 01 01T06 00 00 000Z TimeEnd 1970 0
  • 使用 jQuery AJAX 发送带有二进制数据的 FormData

    我想发送一个FormData通过使用 jQuery AJAX 例如 var uploadFormData new FormData uploadFormData append name value ajax url URL target t
  • 当我返回时,控制到达非空函数的末尾[重复]

    这个问题在这里已经有答案了 我有一个函数 它递归地调用自身 直到连接到服务器 然后函数返回0 为什么我有这样的错误行为 控制到达非空函数的末尾 指向函数结束的行 我做错了什么 我有 if else 语句 仅在 else 中返回 但即使在 i
  • 为什么 Rust 允许在一个作用域中两次声明相同的变量名? [复制]

    这个问题在这里已经有答案了 我第一次遇到允许在同一范围内声明变量名称两次的类型化语言 难道不会有机会错误地覆盖现有变量吗 它带来什么优势 有书中有一章介绍了这一点 隐藏与将变量标记为 mut 不同 因为如果我们不小心尝试在不使用 let 关
  • 从公共方法调用私有方法?

    我定义了一个这样的类 function Class1 this Func1 function Methods and vars function Func2 Methods and vars 我想找到一种从私有方法 Func2 调用公共方法
  • 在 vbscript 中使用 HTA

    在使用 VBscript 的 HTA 用户窗体时 我发现 HTA 不支持 WScript 及其对象 方法 是否有其他创建用户表单的方法 或者有什么方法可以使 HTA 支持 WScript 替代方案WScript Echo就是简单地将内容添加
  • 如何在 Openmodelica 中指定介质?

    我正在 Modelica 中模拟热泵热水系统 我附上了我的模特的照片 但是 当我运行模型时 出现错误 Medium 是部分的 部分类中不允许进行名称查找 您能告诉我吗 我该如何指定水箱 热泵冷凝器和管道中的水 我应该如何指定热泵蒸发器中的空
  • 使用包含通配符条件的数组时出现问题

    我一直在尝试运行 powershell 代码将文件分成 2 个 我有几个常规数组 效果很好 第三个数组包含每个条件的通配符 但这根本不起作用 我尝试过 in notin like notlike contains notcontains m
  • 如何最大程度地划分集合?

    我正在尝试解决欧拉计划问题之一 因此 我需要一种算法来帮助我以任意顺序找到集合中所有可能的分区 例如 给定集合2 3 3 5 2 3 3 5 2 3 3 5 2 3 3 5 2 3 3 5 2 5 3 3 等等 几乎该组成员的所有可能组合
  • MPMoviePlayer 控制风格

    我想使用以下代码隐藏 MPMoviePlayer 中的控件 IBAction video id sender NSBundle bundle NSBundle mainBundle NSString moviePath bundle pat
  • 如何在宏中获取当前命名空间的字符串

    我需要在宏中添加名称空间前缀 IE define MYMACRO x x namespace A namespace B MYMACRO C 并且 MYMACRO 必须返回 A B C 无法工作 命名空间由编译器识别 编译器仅在预处理器之后
  • 设置图像属性时,UIImageView 图像不会明显更新

    我有一个 UIImageView 其用户交互是真实的 并且我为其提供了点击手势识别器 其操作处理程序如下 IBAction func tap sender UITapGestureRecognizer let iv sender view
  • 如何使用 browsermob-proxy 修复“地址已在使用中”错误?

    我还在尝试使用browsermob proxy here 尝试在 python selenium 测试期间监控网络流量 请参阅browsermob代理 我正在使用以下脚本来测试它 from browsermobproxy import Se
  • 如何解码众多 Decodable Swift 中的单个异常属性?

    我有一个符合 Decodable 的结构 它有 50 个 String 属性 只有 1 个 Bool 属性 该布尔值来自服务器 如字符串 false true 或有时如整数 0 1 因此无法从框中解码 我怎样才能让它解码而不是对所有 50