NSJSONSerialization 没有返回错误

Posted

技术标签:

【中文标题】NSJSONSerialization 没有返回错误【英文标题】:NSJSONSerialization no returns error 【发布时间】:2014-07-13 18:28:31 【问题描述】:

有代码:

var err: NSError
var jsonDict = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as Array<NSDictionary>

如果数据有 JSON,它就完美了。但是,如果还有其他东西(不是 JSON 数组),它只会出现致命错误,并且 ios 模拟器会以 EXC_BAD_INSTRUCTION 关闭。 所以没有电话err。我之前如何查看data?或者抓住错误。

【问题讨论】:

只要 NSData 操作数确实是 NSData,JSONObjectWithData 操作就不会产生异常。您得到的是 NSArray 还是 NSDictionary(或 nil)取决于 JSON 字符串中的内容。 【参考方案1】:

(对不起,我赶时间,暂无描述。)

    var err: NSError?
    var jsonDict: AnyObject!
    var data: AnyObject = " ".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
    if let d = data as? NSData 
        jsonDict = NSJSONSerialization.JSONObjectWithData(d, options: NSJSONReadingOptions.MutableContainers, error: &err)
        if let dict = jsonDict as? NSDictionary 
            // Do something with `dict`
            println(dict)
        
    

【讨论】:

NSJSONSerialization 应该返回类型。在我的示例中是:Array. 它返回AnyObject!,因为在编译时您无法知道是否会返回字典或数组(或字符串?)。您必须在运行时检查(并转换)。【参考方案2】:

这可能是因为 JSONObjectWithData 被声明为返回 id,但实际上它返回 NSDictionary*、NSArray* 或 nil - 在 Swift 中,将 nil 分配给 id 类型的变量会因设计而崩溃。你需要给 jsonDict 一个类型,可能是一个可选的 NSMutableDictionary* 或 NSMutableArray*。

【讨论】:

在我的示例中它不会是 NSMutableDictionary 或 NSMutableArray。你能给你的吗? 看看你的电话。你要求可变容器。因此它将返回一个可变容器,而不是不可变容器。你要求可变,你得到可变。如果出现错误,则为 nil。

以上是关于NSJSONSerialization 没有返回错误的主要内容,如果未能解决你的问题,请参考以下文章

NSJSONSerialization 返回 null - Objective-c

使用 NSJSONSerialization 将 NSMutableDictionary 转换为 JSON 会返回不同的结果

使用 NSDictionary 访问 NSJSONSerialization 数据

NSJSONSerialization生成NSCFString *和NSTaggedPointerString *

NSJSONSerialization 不解析这个 JSON

NSJSONSerialization 带整数