JSON String a NSDictionary con Swift

Estoy intentando crear un dictionary a partir de los datos que se almacenan en un server, recibo los datos pero no puedo convertirlos a un NSDictionary , creo que se mantiene en un object NSData

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

Esta línea de código es la que me da el problema, arroja un BAD_EXEC_INSTRUCTION .

MI pregunta: ¿Cómo puedo convertir un JSON en un NSDictionary ?

Su código no hace ningún event handling errores. Pero puede (y si estos datos provienen de un service web, lo harán) fallarán de múltiples maneras.

  1. Tienes que asegurarte de que tu object de datos realmente exista.
  2. Debe asegurarse de que el object de datos se pueda convertir a JSON.
  3. Tienes que asegurarte de que JSON realmente contenga un Diccionario

Debería usar el molde condicional Swifts y sus capacidades de enlace opcionales.
El enlace opcional if let JSONData = JSONData verifique que JSONData no es nula. ¡La fuerza de desenvolver ( JSONData! ) Que usa puede bloquearse si no se pueden recibir datos.

El enlace opcional if let json = NSJSONSerialization.JSONObjectWithData comtesting si los datos se pudieron convertir a un object JSON. El elenco condicional as? NSDictionary as? NSDictionary comtesting si el object JSON es en realidad un dictionary. Actualmente no utiliza estas verificaciones, arroja los objects como NSDictionary. Que se bloqueará, si el object no es válido json, o si no es un dictionary.

Recomendaría algo como esto:

 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") } 

Puede fusionar los controles 2 y 3 en una línea y comprobar si NSJSONSerialization puede crear un NSDictionary directamente:

 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") } 

Asegúrese de replace fatalError con el event handling errores apropiado en su código de producción

Actualización para Swift 2.

Ahora debe usarlo dentro de un bloque de testing de captura.

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

Aquí jsonResult te dará la respuesta en NSDictionary :

 let url = NSURL(string: path) let session = NSURLSession.shanetworkingSession() 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()