为什么JSON解析器没有捕获未经验证的数据?

时间:2014-10-08 21:45:05

标签: ios json swift error-handling runtime-error

一次&我得到了 fatal crash: EXC_BAD_INSTRUCTION

这可能在几次迭代后发生。

我已经跟踪了崩溃的来源(我认为是 NSJSONSerialization 解析器碰巧得到了非-validated string - >数据。

也就是说,它适用于几次迭代(退出,重新启动应用程序并再次运行);然后崩溃了。清理模拟器&重建...模式重复。

我通过在JSON调用之前执行 println(string) 来发现这一点;并将字符串剪切/粘贴到JSON验证器中,并在开头找到 错误 '('

({"photos":{"page":1,"pages":1340,.....

这是实际的屏幕转储:

enter image description here

问题:为什么JSON解析器没有在 NSError 中捕获此错误,而不是 fatal exception
......这是一个错误吗?

1 个答案:

答案 0 :(得分:0)

您强行解开从NSJSONSerialization.JSONObjectWithData()返回的对象,但如果发生解析器错误,它将为nil。发生这种情况时,会因运行时错误而崩溃。

由于您根本不查看jsonError的内容,因此可以忽略error参数并使用可选绑定; e.g。

if let JSONDict = NSJSONSerialization.JSONObjectWithData(data!,
  options: .AllowFragments,
  error: nil) as NSDictionary {
    // do something with JSONDict
} else {
    println("error")
    return
}

如果您确实想检查错误对象,可以这样写:

let JSONDict = NSJSONSerialization.JSONObjectWithData(data!,
  options: .AllowFragments,
  error: &jsonError) as NSDictionary?

if JSONDict == nil {
    if let err = jsonError {
        println(err.localizedDescription)
    }
    return
}

// Do something with JSONDict