使用 Swift 4 Decodable 将字符串 JSON 响应转换为布尔值

Posted

技术标签:

【中文标题】使用 Swift 4 Decodable 将字符串 JSON 响应转换为布尔值【英文标题】:Convert string JSON response to a boolean using Swift 4 Decodable 【发布时间】:2017-10-20 13:13:11 【问题描述】:

我正在重构一些以前使用第三方 JSON 解析器的项目,但我遇到了一个返回布尔值作为字符串的愚蠢网站。

这是来自 JSON 响应的相关 sn-p:


    "delay": "false",
    /* a bunch of other keys*/

我的解码结构如下所示:

struct MyJSONStruct: Decodable 
  let delay: Bool
  // the rest of the keys

如何将 JSON 响应中返回的字符串转换为 Bool 以匹配我在 Swift 4 中的结构?虽然this post 很有帮助,但我不知道如何将字符串响应转换为布尔值。

【问题讨论】:

覆盖init(decoder: Decoder) 并手动处理所有解码。我之所以这么说是因为您不能选择性地解码某些字段而不是其他字段。 哎哟。我有大约 20 个键和一些嵌套结构,全部用于一个布尔值。 比较***.com/q/44594652/2976878 【参考方案1】:

基本上你必须编写一个自定义初始化器,但是如果有很多 good 键但只有一个可以从一个类型映射到另一个,那么计算属性可能会很有用

struct MyJSONStruct: Decodable 
   var delay: String
   // the rest of the keys

   var boolDelay : Bool 
       get  return delay == "true" 
       set  delay = newValue ? "true" : "false" 
   

【讨论】:

哦!太精彩了!我宁愿添加 3 行代码而不是自定义初始化程序。谢谢! @LeoDabus 我将let 更改为var。再次感谢这个简单的解决方法。【参考方案2】:

您需要在 URLEncoding 初始化程序中设置 boolEncoding: .literal。

boolEncoding: .literal

【讨论】:

以上是关于使用 Swift 4 Decodable 将字符串 JSON 响应转换为布尔值的主要内容,如果未能解决你的问题,请参考以下文章

Swift 4 Decodable - 将 JSON 对象解码为“数据”

在 Swift 4 中使用 Decodable 解析 JSON

在 Swift 4 中使用 Decodable 和继承

使用 Swift 4 的 Decodable 解码 Void

处理包含多种类型的 JSON 数组 - Swift 4 Decodable

Swift 4 Decodable:给定的数据不是有效的 JSON