将JSON字符串转换为Dictionary <string,any =“”>会将Boolean序列化为Int

时间:2019-05-13 21:25:51

标签: ios json swift

我正在尝试将Json字符串序列化为字典 并且它将boolean值转换为int值。 检查代码。

检查键“ BoolArgument”的输出值,并返回1而不是true

注意:我无法使用Codable将字符串转换为快速数据对象,因为json词典中的键不是常量。

========================
Code
========================

let inputArgumentsString = "{\"FloatArgument\":1.0,\"BoolArgument\":true,\"ObjectArgument\":{}}"

var toJson: Dictionary<String, Any>? {
     guard let data = self.data(using: .utf8) else { return nil }
     do {
         return try JSONSerialization.jsonObject(with: data, options : .allowFragments) as? Dictionary<String, Any>
     } catch let error {
         print(error.localizedDescription)
         return nil
     }
 }

print(self.inputArgumentsString?.toJson)```

========================
Output
========================

po self.inputArgumentsString?.toJson
▿ Optional<Dictionary<String, Any>>
  ▿ some : 3 elements
    ▿ 0 : 2 elements
      - key : "BoolArgument"
      - value : 1
    ▿ 1 : 2 elements
      - key : "ObjectArgument"
      - value : 0 elements
    ▿ 2 : 2 elements
      - key : "FloatArgument"
      - value : 1

2 个答案:

答案 0 :(得分:2)

这只是调试器对结果的描述。

对于Bool,它使用NSNumber,其值1作为true,而0作为false

如果您调用代码,例如:

guard let json = self.inputArgumentsString?.toJson,
        let boolean = json["BoolArgument"] as? Bool
        else { return }

print(boolean)

它将打印truefalse


如果要检查该值是否为布尔值,可以尝试使用类似以下的方法:

for key, value in json {
  if let number = value as? NSNumber {
    let numberType = CFNumberGetType(number as CFNumberRef)

    switch numberType {
      case .charType:
        //Bool
        print(key, value as? Bool)
      case .sInt8Type, .sInt16Type, .sInt32Type, .sInt64Type, .shortType, .intType, .longType, .longLongType, .cfIndexType, .nsIntegerType:
        //Int
        print(key, value as? Int)
      case .float32Type, .float64Type, .floatType, .doubleType, .cgFloatType:
        //Double
        print(key, value as? Double)
    }
  }
}

答案 1 :(得分:1)

在内部,JSONSerialization是一个Objective-C类,它使用NSNumber实例表示JSON中的数字和布尔值。当您打印字典时,这些实例将打印其数值。但是,NSNumber知道何时存储布尔值,因此当您尝试访问该值时,它将自动桥接。 toJSON["BoolArgument"] as? Bool应该提供正确的值。

无论如何,使用Codable正确解析您的类型可能是一个更好的解决方案。