我正在尝试将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
答案 0 :(得分:2)
这只是调试器对结果的描述。
对于Bool
,它使用NSNumber
,其值1
作为true
,而0
作为false
。
如果您调用代码,例如:
guard let json = self.inputArgumentsString?.toJson,
let boolean = json["BoolArgument"] as? Bool
else { return }
print(boolean)
它将打印true
或false
。
如果要检查该值是否为布尔值,可以尝试使用类似以下的方法:
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
正确解析您的类型可能是一个更好的解决方案。