Cocoa 致命错误:尝试解析JSON时,在Swift中展开可选值时意外发现nil

Cocoa 致命错误:尝试解析JSON时,在Swift中展开可选值时意外发现nil,cocoa,swift,nsjsonserialization,Cocoa,Swift,Nsjsonserialization,我曾尝试构建一个基于文档的Cocoa应用程序,当我尝试在readFromData:ofType:error:method中解析JSON时,我遇到了一个错误:致命错误:在展开可选值时意外发现了nil。导致错误的实际行如下所示: override func readFromData(data: NSData?, ofType typeName: String?, error outError: NSErrorPointer) -> Bool { var error: NSErrorPo

我曾尝试构建一个基于文档的Cocoa应用程序,当我尝试在readFromData:ofType:error:method中解析JSON时,我遇到了一个错误:致命错误:在展开可选值时意外发现了nil。导致错误的实际行如下所示:

override func readFromData(data: NSData?, ofType typeName: String?, error outError: NSErrorPointer) -> Bool {
    var error: NSErrorPointer!
    var loadedDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments, error: error) as? NSDictionary // this causes an error
    return true
}
看起来是NSJSONSerialization.JSONObjectWithData方法导致了错误,但它为什么会发出错误

我将options:argument更改为nil或0,还将error:argument更改为nil,但没有解决问题

我还确保数据不是零

那么我错过了什么?我认为JSON方法试图在其中强制展开,但我怎么知道呢?我怎样才能避免这个致命错误,让我的应用程序正常运行


我在Yosemite beta3上使用Xcode6 beta 3。

最可能的问题是,您的数据实际上不是JSON,因此反序列化将返回nil,或者数据是一个数组,将其转换为字典显然会崩溃


你似乎不了解一些基本知识。你认为AllowFragments将实现什么?你为什么把误差改为零?您了解错误变量的用途吗?它告诉您JSON解析器发现了哪些错误。通过将变量设置为nil,可以阻止它对您的帮助

最可能的问题是,您的数据实际上不是JSON,因此反序列化将返回nil,或者数据是一个数组,将其转换为字典显然会崩溃

你似乎不了解一些基本知识。你认为AllowFragments将实现什么?你为什么把误差改为零?您了解错误变量的用途吗?它告诉您JSON解析器发现了哪些错误。通过将变量设置为nil,可以阻止它对您的帮助

在本例中,outError作为参数提供,所以您应该使用它,我忽略了这一点。 看起来这个函数的目的是检查数据是否是有效的JSON。 那么你的函数应该是:

override func readFromData(data: NSData?, ofType typeName: String?, error outError: NSErrorPointer) -> Bool {
    if let loadedDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments, error: outError) as? NSDictionary {
       return true
    } else {
       return false
    }
}
现在此函数:

如果发生错误,则将错误写入在ourError中指定的调用方所在的位置 返回数据是否作为NSDictionary有效 仅供参考,我碰巧也编写了一个JSON处理程序

其中包括NSJSONSerialization.JSONObjectWithData

在本例中,outError作为参数提供,所以您应该使用它,我忽略了这一点。 看起来这个函数的目的是检查数据是否是有效的JSON。 那么你的函数应该是:

override func readFromData(data: NSData?, ofType typeName: String?, error outError: NSErrorPointer) -> Bool {
    if let loadedDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments, error: outError) as? NSDictionary {
       return true
    } else {
       return false
    }
}
现在此函数:

如果发生错误,则将错误写入在ourError中指定的调用方所在的位置 返回数据是否作为NSDictionary有效 仅供参考,我碰巧也编写了一个JSON处理程序


其中包括NSJSONSerialization.JSONObjectWithData。

如果数据不包含有效的JSON对象,JSONObjectWithData函数将返回一个nil,因此您需要按如下方式执行条件展开:

if let dict = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: jsonError) as? NSDictionary {
    println("Dictionary: \(dict)")
} else {
   println("nil")
   let resultString = NSString(data: data, encoding: NSUTF8StringEncoding)
   println("Flawed JSON String: \(resultString)")
}

我希望它能帮助。。。。。e

如果数据不包含有效的JSON对象,JSONObjectWithData函数将返回一个nil,因此您需要按如下方式执行条件展开:

if let dict = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: jsonError) as? NSDictionary {
    println("Dictionary: \(dict)")
} else {
   println("nil")
   let resultString = NSString(data: data, encoding: NSUTF8StringEncoding)
   println("Flawed JSON String: \(resultString)")
}

我希望它能帮助。。。。。e

1。如果您不需要太多检查错误,请始终处理错误!2.为什么要使用AllowFragments?1。如果您不需要太多检查错误,请始终处理错误!2.为什么要使用AllowFragments?一个示例json文件来测试我们的脚本怎么样?一个示例json文件来测试我们的脚本怎么样?