尝试将有效的JSON数据从NSURLConnection转换为Swift中的NSDictionary时出现崩溃/错误

时间:2014-06-25 21:54:37

标签: ios json swift ios8

我一直在尝试使用我正在处理的示例swift iOS应用程序上的示例Rest请求。我已经从我看过的一些教程中提到说这可行,但我的应用程序似乎崩溃了

 var jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as NSDictionary

swift_dynamicCast库中抛出异常。我可以将我的响应转换为String而没有问题,字符串是一个有效的json数组。任何想法?

以下是我的测试功能的完整代码。

    let url:NSURL = NSURL(string:"http://jsonplaceholder.typicode.com/comments")
    let request:NSURLRequest = NSURLRequest(URL:url)
    let queue:NSOperationQueue = NSOperationQueue()
    NSURLConnection.sendAsynchronousRequest(request, queue: queue, completionHandler:{ (response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in

        var stringData :NSString = NSString(data:data, encoding:NSUTF8StringEncoding)
        println(stringData)
        var err: NSError?

        var jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as NSDictionary

        if(err?) {
            println("JSON Error (err!.localizedDescription)")
        }

        println("AsSynchronous\(jsonResult)")


        })

3 个答案:

答案 0 :(得分:4)

更改

var jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as NSDictionary

   if let jsonResult: AnyObject = NSJSONSerialization.JSONObjectWithData(data,options:nil,error: nil) {
                if jsonResult is NSDictionary {
                    var myDict: NSDictionary = jsonResult as NSDictionary
                    println("myDict:\(myDict)") 
                }
                else if jsonResult is NSArray {
                    var myArray: NSArray = jsonResult as NSArray
                    println("myArray:\(myArray)")

            }
        }

一切正常。它能够将其解析为NSArray而不是NSDictonary。根据堆栈溢出聊天中的代码,我现在拥有的代码将适用于Http请求返回的JSON数组和JSON对象。

答案 1 :(得分:1)

作为您自己的解决方案的补充,您可以使用if let语句使您的投射更简洁。

if let jsonResult: AnyObject = NSJSONSerialization.JSONObjectWithData(data,options:nil,error: nil) {
    if let myDict = jsonResult as? NSDictionary {
        println("myDict:\(myDict)")
    }
    else if let myArray = jsonResult as? NSArray {
        println("myArray:\(myArray)")
    }
}

此示例中的if let语句检查jsonResult是否可以强制转换为NSDictionary或NSArray,以及是否可以将myDict / myArray设置为jsonResult的类型转换版本并输入if身体。如果他们无法将代码转换为if,那么就不会被执行。它的功能与您的解决方案相同,但对我来说感觉更简洁,更清洁。

此外,由于您使用了NSJSONReadingOptions.MutableContainers选项,因此您可能需要投放NSMutableArrayNSMutableDictionary

答案 2 :(得分:1)

修改上述答案以适应最新的Swift 2.1版本 如上所述,类型转换为NSArray, 它工作并处理json数据

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let url = NSURL(string: "http://jsonplaceholder.typicode.com/comments")

     //  or use this  http://jsonplaceholder.typicode.com/comments or this http://puppygifs.tumblr.com/api/read/json

        let session = NSURLSession.sharedSession()
        let task = session.dataTaskWithURL(url!, completionHandler: { (data, response, error) -> Void in

        if error != nil {

                print(error)

            } else {

                do {

                    let jsonResult = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as! NSArray

                // print(jsonResult)

                    print(jsonResult[0])

                } catch {
                    print("my error")
                }


            }

        })

        task.resume()

    }


}