//parse the recieved Data to JSON
//check if Data is valid JSON
if(recvdata != nil) {
if let parsedJson : AnyObject = try! JSONSerialization.jsonObject(with: recvdata!, options: []) as AnyObject?{
//Data is valid JSON
print("Json parsed")
if let _ = parsedJson as? NSDictionary {
//JSON is valid NSDictionary
if((parsedJson.value(forKey: "res")! as! NSObject) as! Decimal == 1) {
print("Synchronization success")
return true
}
else {
print("Synchronization failed")
return false
}
}
else {
print("Error in converting JSON to NSDictionary")
return false
}
}
else {
print("Error in parsing JSON-Answer")
return false
}
}
else {
print("recvdata == nil! No response to synchronous request!")
return false
}
收到数据后,我想将数据解析为JSON格式。但在以下行中出现错误
"无法转换类型' __ NSCFBoolean' (0x1b5905868)来 ' NSDecimalNumber' (0x1b5912c70)"
发生。
if((parsedJson.value(forKey: "res")! as! NSObject) as! Decimal == 1) {
在Xcode 2中它起作用了:
if((parsedJson.valueForKey("res")! as! NSObject == 1) {
请帮我修复此错误! 提前谢谢!
答案 0 :(得分:3)
转而使用Bool
:
if parsedJson["res"]! as! NSNumber as Bool {
甚至更好,直接且没有强制解包:
if parsedJson["res"] as? Bool ?? false {
Decimal
是一个特定的十进制类型,只是为了得到布尔值而转换它是没有意义的。
但是,使用专用的类型安全的投射库,例如SwiftyJSON将是一个更好的解决方案。
答案 1 :(得分:1)
您发布的代码存在许多问题。你有太多的强制解雇选项会导致崩溃。在解析数据时,您没有正确处理try
。您使用NSDictionary
而不是Swift词典。并且您没有正确获取"res"
键的值,这是导致立即错误的原因。
我会按如下方式重写您的代码:
if let data = recvdata {
do {
if let parsedJson = try JSONSerialization.jsonObject(with: recvdata, options: []) as? [String:Any] {
if let res = parsedJson["res"] as? Bool {
return res
} else {
// No res value (or it's not a Bool)
}
} else {
// Not a dictionary
}
} catch {
// Can't parse data
}
} else {
// no data
}
return false
请注意使用安全展开选项。请注意使用do/catch
来处理try
的使用。注意使用Swift词典。
答案 2 :(得分:0)
AnyObject
已替换为Any
。NSDictionary
,而是在与强类型系统作战。valueForKey:
。if let parsedJson = try! JSONSerialization.jsonObject(with: recvdata!) as? [String:Any] {
if let resValue = parsedJson["res"] as? Bool, resValue == true {
print("Synchronization success")
return true
}
...