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

Ios 使用Swift将JSON字符串转换为NSDictionary,ios,json,xcode,swift,Ios,Json,Xcode,Swift,我正在尝试从服务器中保存的数据创建字典,我收到了数据,但无法将数据转换为NSDictionary,我相信它保存在NSData对象中 let JSONDictionary: Dictionary = NSJSONSerialization.JSONObjectWithData(JSONData!, options: nil, error: &error) as NSDictionary 这行代码就是我遇到问题的代码,它抛出了一条错误的执行指令 我的问题是:如何将JSON转换为NSDict

我正在尝试从服务器中保存的数据创建字典,我收到了数据,但无法将数据转换为
NSDictionary
,我相信它保存在
NSData
对象中

let JSONDictionary: Dictionary = NSJSONSerialization.JSONObjectWithData(JSONData!, options: nil, error: &error) as NSDictionary
这行代码就是我遇到问题的代码,它抛出了一条
错误的执行指令


我的问题是:如何将
JSON
转换为
NSDictionary

这里
jsonResult
将在
NSDictionary
中给出响应:

let url = NSURL(string: path)
        let session = NSURLSession.sharedSession()
        let task = session.dataTaskWithURL(url!, completionHandler: {data, response, error -> Void in
            println("Task completed")
            if(error != nil) {
                // If there is an error in the web request, print it to the console
                println(error.localizedDescription)
            }
            var err: NSError?
            var jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as NSDictionary
            if(err != nil) {
                // If there is an error parsing JSON, print it to the console
                println("JSON Error \(err!.localizedDescription)")
            }

        })
        task.resume()

您的代码不会进行任何错误处理。但它可以(如果这些数据来自web服务,它将)以多种方式失败

  • 您必须确保您的数据对象确实存在
  • 您必须确保数据对象可以转换为JSON
  • 您必须确保JSON实际上包含一个字典
  • 您应该使用Swifts条件转换及其可选绑定功能。
    如果让JSONData=JSONData检查JSONData是否为nil,则可选绑定
    。如果无法接收数据,您使用的强制展开(
    JSONData!
    )可能会崩溃

    如果让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
    Swift 2的更新。

    现在您必须在try-catch块中使用它

        do {
            let responseObject = try NSJSONSerialization.JSONObjectWithData(data, options: []) as! [String:AnyObject]
        } catch let error as NSError {
     print("error: \(error.localizedDescription)")
    }
    

    您能否发布一些代码,说明如何声明NSData对象以及在何处/如何初始化它。第二个错误中的注释应为:
    //如果解析JSON时出错,这一行永远不会到达,因为当您尝试打开一个nil值时,代码出错
    @zaid pathan我已取消您的编辑,因为它引入了一个问题。如果删除N错误向下广播,则无法再调用
    错误上的
    本地化描述
    方法。无论如何,请避免对代码进行修改。谢谢。:)