JSONstring与Swift的NSDictionary

我想创build一个从服务器中的数据的字典,我收到的数据,但我不能将数据转换为NSDictionary ,我相信它是在一个NSData对象

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

这行代码是给我的问题,它抛出一个BAD_EXEC_INSTRUCTION

我的问题:我怎样才能把一个JSON变成一个NSDictionary

你的代码不会做任何error handling。 但它可以(如果这个数据来自一个Web服务,将会)以多种方式失败。

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

你应该使用Swifts条件转换,它是可选的绑定function。
可选的绑定, if let JSONData = JSONData检查JSONData不是零。 如果没有收到数据,您使用的解包( JSONData! )可能会崩溃。

可选的绑定, if let json = NSJSONSerialization.JSONObjectWithData检查数据是否可以转换为JSON对象。 有条件的转换as? NSDictionary 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可以直接创build一个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") } 

确保在生产代码中用适当的error handling来replacefatalError

更新Swift 2。

现在你必须在try catch块中使用它。

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

这里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()