Cómo recuperar los datos JSON de respuesta con Swift

Estoy intentando utilizar la API de Yelp y recibir el JSON correspondiente según un término de búsqueda. Aquí está el cliente de YelpAPI que estoy usando:

import Foundation import UIKit let yelpConsumerKey = "KLGXXXXfnmhQ" let yelpConsumerSecret = "wPmXXXXvOA" let yelpToken = "0-3DsXXXXhAq" let yelpTokenSecret = "BViXXXXQ-Dz3Y" class YelpClient: BDBOAuth1RequestOperationManager { var accessToken: String! var accessSecret: String! requinetworking init(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } class var shanetworkingInstance : YelpClient { struct Static { static var token : dispatch_once_t = 0 static var instance : YelpClient? = nil } dispatch_once(&Static.token) { Static.instance = YelpClient(consumerKey: yelpConsumerKey, consumerSecret: yelpConsumerSecret, accessToken: yelpToken, accessSecret: yelpTokenSecret) } return Static.instance! } init(consumerKey key: String!, consumerSecret secret: String!, accessToken: String!, accessSecret: String!) { self.accessToken = accessToken self.accessSecret = accessSecret var baseUrl = NSURL(string: "http://api.yelp.com/v2/") super.init(baseURL: baseUrl, consumerKey: key, consumerSecret: secret); var token = BDBOAuthToken(token: accessToken, secret: accessSecret, expiration: nil) self.requestSerializer.saveAccessToken(token) } func searchWithTerm(term: String, success: (AFHTTPRequestOperation!, AnyObject!) -> Void, failure: (AFHTTPRequestOperation!, NSError!) -> Void) -> AFHTTPRequestOperation! { // For additional parameters, see http://www.yelp.com/developers/documentation/v2/search_api var parameters = ["term": term, "ll": "37.77493,-122.419415"] return self.GET("search", parameters: parameters, success: success, failure: failure) } func searchWithTerm(term: String, deal: Bool, radius: Int, sort: Int, categories: String, success: (AFHTTPRequestOperation!, AnyObject!) -> Void, failure: (AFHTTPRequestOperation!, NSError!) -> Void) -> AFHTTPRequestOperation! { // For additional parameters, see http://www.yelp.com/developers/documentation/v2/search_api var parameters = NSDictionary() if (radius == -1) { parameters = ["term": term, "ll": "37.77493,-122.419415", "deals_filter": deal, "sort": sort, "category_filter":categories] } else { var meter:Double = Double(radius) * 1609.34 parameters = ["term": term, "ll": "37.77493,-122.419415", "deals_filter": deal, "radius_filter": meter, "sort": sort, "category_filter":categories] } return self.GET("search", parameters: parameters as [NSObject : AnyObject], success: success, failure: failure) } } 

Hice una class model para los restaurantes aquí:

 import UIKit class Resturant: NSObject { var name: String! var thumbUrl: String! var address: String! var jsonData: NSData! init(dictionary: NSDictionary) { name = dictionary["name"] as? String thumbUrl = dictionary["thumbUrl"] as? String address = dictionary["address"] as? String } class func searchWithQuery(query: String, completion: ([Resturant]!, NSError!) -> Void) { YelpClient.shanetworkingInstance.searchWithTerm(query, success: { (operation: AFHTTPRequestOperation!, response: AnyObject!) -> Void in println(response) let JSONObject = NSJSONSerialization.JSONObjectWithData(response as! NSData, options: NSJSONReadingOptions(0), error: nil) }) { (operation: AFHTTPRequestOperation!, error: NSError!) -> Void in } } } 

let JSONObject = NSJSONSerialization.JSONObjectWithData(response as! NSData, options: NSJSONReadingOptions(0), error: nil)

Esta línea de código solicita este error:

Could not cast value of type '__NSCFDictionary' (0x10b914a60) to 'NSData' (0x10b913a48).

Usted recibe la respuesta JSON. Es solo que se trata de un object NSData NSData que desea convertir al object JSON, si no me equivoco. En este momento, supongo que imprimirá bloques ilegibles de caracteres alfanuméricos, ¿verdad?

Bueno, puedes hacer algo como:

 class func searchWithQuery(query: String, completion: ([Resturant]!, NSError!) -> Void) { YelpClient.shanetworkingInstance.searchWithTerm(query, success: { (operation: AFHTTPRequestOperation!, response: AnyObject!) -> Void in println(response) //Illegible block of data let JSONObject = NSJSONSerialization.JSONObjectWithData(response, options: NSJSONReadingOptions(0), error: nil) println(JSONObject)//Prints JSON }) { (operation: AFHTTPRequestOperation!, error: NSError!) -> Void in } } 

EDITAR # 1

Parece que es el caso de una mala request. Sea claro sobre el contrato entre el cliente y el server para este trabajo. Debe haber algún parámetro que pueda faltar o una request inesperada. Me temo que no podemos ayudarlo ya que no sabemos qué es ese contrato.

EDITAR # 2

En este punto de código …

 let JSONObject = NSJSONSerialization.JSONObjectWithData(response, options: NSJSONReadingOptions(0), error: nil) 

… la API acepta el tipo de respuesta como NSData . Pero su tipo de respuesta es NSDictionary . Te estaría dando una advertencia; sin embargo, no hay verificación de tipo en el momento de compilation, comstack. Pero el time de ejecución está tratando de tratar la response como NSData , pero no lo es; En realidad es un NSDictionary , falla.

Solo ingrese al NSDictionary . Obtendrás los resultados

Edita # 3 Tu código final debería ser como este:

 class func searchWithQuery(query: String, completion: ([Resturant]!, NSError!) -> Void) { YelpClient.shanetworkingInstance.searchWithTerm(query, success: { (operation: AFHTTPRequestOperation!, response: AnyObject!) -> Void in println(response) //Illegible block of data let responseInfo = response as! NSDictionary println(responseInfo) //Prints JSON }) { (operation: AFHTTPRequestOperation!, error: NSError!) -> Void in } }