无法转换类型' __ NSCFBoolean'的值(0x1b5905868)到' NSDecimalNumber' (0x1b5912c70)

时间:2017-03-21 15:05:53

标签: json swift

//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) {

请帮我修复此错误! 提前谢谢!

3 个答案:

答案 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)

  • 在Swift 3中,JSON AnyObject已替换为Any
  • 根本不要在Swift中使用NSDictionary,而是在与强类型系统作战。
  • 除非你真的需要KVC(并且可以解释原因),否则不要使用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
    }
    ...