使用Swift将JSON字符串转换为NSDictionary

阿拉法尔

我正在尝试根据服务器中保存的数据创建字典,我收到了数据,但是无法将数据转换为NSDictionary,我认为它保存在NSDataObject中

let JSONDictionary: Dictionary = NSJSONSerialization.JSONObjectWithData(JSONData!, options: nil, error: &error) as NSDictionary

这行代码是给我问题的代码,它引发了BAD_EXEC_INSTRUCTION

我的问题:如何将aJSON变成a NSDictionary

马蒂亚斯·鲍赫(Matthias Bauch)

您的代码不执行任何错误处理。但是它可能(并且如果这些数据来自Web服务,则将以多种方式)失败。

  1. 您必须确保您的数据对象确实存在
  2. 您必须确保可以将数据对象转换为JSON
  3. 您必须确保JSON实际上包含一个Dictionary

您应该使用Swifts条件转换及其可选的绑定功能。
可选绑定if let JSONData = JSONData检查JSONData是否为nil。JSONData!如果无法接收到数据,则您使用的强制展开()可能会崩溃。

可选绑定if let json = NSJSONSerialization.JSONObjectWithData检查是否可以将数据转换为JSON对象。条件强制转换as? NSDictionary检查JSON对象是否实际上是字典。您当前不使用这些检查,而是将对象强制转换为NSDictionary。如果对象不是有效的json,或者它不是字典,则会崩溃。

我建议这样的事情:

var error: NSError?
if let JSONData = JSONData { // Check 1
    if let json: AnyObject = NSJSONSerialization.JSONObjectWithData(JSONData, options: nil, error: &error) { // Check 2
        if let jsonDictionary = json as? NSDictionary { // Check 3
            println("Dictionary received")
        }
        else {
            if let jsonString = NSString(data: JSONData, encoding: NSUTF8StringEncoding) {
                println("JSON String: \n\n \(jsonString)")
            }
            fatalError("JSON does not contain a dictionary \(json)")
        }
    }
    else {
        fatalError("Can't parse JSON \(error)")
    }
}
else {
    fatalError("JSONData is nil")
}

您可以将检查2和检查3合并为一行,并检查NSJSONSerialization是否可以直接创建NSDictionary:

var error: NSError?
if let JSONData = JSONData { // Check 1.
    if let JSONDictionary = NSJSONSerialization.JSONObjectWithData(JSONData, options: nil, error: &error) as? NSDictionary { // Check 2. and 3.
        println("Dictionary received")
    }
    else {

        if let jsonString = NSString(data: JSONData, encoding: NSUTF8StringEncoding) {
            println("JSON: \n\n \(jsonString)")
        }
        fatalError("Can't parse JSON \(error)")
    }
}
else {
    fatalError("JSONData is nil")
}

确保fatalError在生产代码中替换为适当的错误处理

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章