2015-07-31 3 views
3

Я пытаюсь использовать API Yelp и получать соответствующий JSON в соответствии с поисковым запросом. Вот Клиент YelpAPI Я использую:Как получить ответ Данные JSON с Swift

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! 

    required init(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
    } 

    class var sharedInstance : 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) 
    } 


} 

Я сделал модель класса для ресторанов здесь:

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.sharedInstance.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)

Эта строка кода запрашивает эту ошибку:

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

ответ

3

Вы получаете ответ JSON. Это просто бинаризованный объект NSData, который вы хотели бы преобразовать в объект JSON, если я не ошибаюсь. Прямо сейчас, я думаю, он напечатает неразборчивые блоки буквенно-цифровых символов, не так ли?

Ну, вы можете сделать что-то вроде:

class func searchWithQuery(query: String, completion: ([Resturant]!, NSError!) -> Void) { 
     YelpClient.sharedInstance.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 

     } 
    } 

EDIT # 1

Похоже, это случай плохого запроса. Прочтите о контракте между клиентом и сервером для этой работы. Должен быть какой-то параметр, который может отсутствовать или что-то неожиданное. Боюсь, мы не можем вам помочь, так как мы не знаем, что это за контракт.

EDIT # 2

На данный момент кода ...

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

... АНИ принимает тип ответа как NSData. Но ваш тип ответа NSDictionary. Это даст вам предупреждение; однако во время компиляции не проверяется тип, он компилируется. Но среда выполнения пытается обрабатывать response как NSData, но это не так; это на самом деле NSDictionary, сбой.

Просто зарегистрируйте NSDictionary. Вы получите результаты.

Edit # 3 Ваш окончательный код должен нравится:

class func searchWithQuery(query: String, completion: ([Resturant]!, NSError!) -> Void) { 
      YelpClient.sharedInstance.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 

      } 
     } 
+0

IT на самом деле ничего не печатает ... что странно. –

+0

Да, см. Отредактированный ответ. Kinda пропустил строку кода. Виноват. – avismara

+0

Как ни в чем не печатается, даже если я пытаюсь сериализовать json. Еще до этого ничего не печаталось, что, похоже, было моей проблемой. –