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

Ios 使用Swift 4 Decodable将字符串JSON响应转换为布尔值,ios,json,swift,swift4,decodable,Ios,Json,Swift,Swift4,Decodable,我正在重构一些以前使用过第三方JSON解析器的项目,我遇到了一个以字符串形式返回布尔值的愚蠢网站 这是JSON响应的相关片段: { "delay": "false", /* a bunch of other keys*/ } 我的解码结构如下所示: struct MyJSONStruct: Decodable { let delay: Bool // the rest of the keys } 如何将JSON响应中返回的字符串转换为Bool以匹配Swift 4中的结

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

这是JSON响应的相关片段:

{
    "delay": "false",
    /* a bunch of other keys*/
}
我的解码结构如下所示:

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

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

基本上,您必须编写一个自定义初始值设定项,但如果有许多好的键,但只有一个键可以从一个类型映射到另一个类型,则计算属性可能会很有用

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

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

基本上,您必须编写一个自定义初始值设定项,但如果有许多好的键,但只有一个可以从一个类型映射到另一个类型,那么计算属性可能会很有用

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

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

您需要在URLEncoding初始值设定项中设置boolEncoding:.literal

boolEncoding: .literal

您需要在URLEncoding初始值设定项中设置boolEncoding:.literal

boolEncoding: .literal

覆盖
init(解码器:解码器)
并手动处理所有解码。我之所以这么说,是因为你不能选择性地解码某些字段,而不是其他字段。哎哟。我有大约20个带嵌套结构的键,全部用于一个布尔值。比较override
init(decoder:decoder)
并手动处理所有解码。我之所以这么说,是因为你不能选择性地解码某些字段,而不是其他字段。哎哟。我有大约20个键和一些嵌套结构,都是一个布尔值。比较一下哦!太棒了!我宁愿添加3行代码,而不是自定义初始值设定项。谢谢大家!@LeoDabus I将
let
更改为
var
。再次感谢您的简单解决方案。哦!太棒了!我宁愿添加3行代码,而不是自定义初始值设定项。谢谢大家!@LeoDabus I将
let
更改为
var
。再次感谢这个简单的解决方法。