2015-04-18 68 views
0

我正在使用alamofire進行GET請求,並嘗試使用SwiftyJSON轉換爲JSON。我可以成功地發出請求,但我無法將響應轉換爲可用的JSON對象。如何使用SwiftyJSON獲取正確的JSON響應?

我試圖從foursquare場地詳細信息響應中獲取數據,並使用有關場地的相應信息更新UITableView(詳細信息頁面)。 UITableView有3個不同的部分。

這是我的VenueDetailViewController(UITableViewController)的makeRequest代碼。

func makeRequest() { 

    Alamofire.request(.GET, self.foursquareEndpointURL, parameters: [ 

     "client_id" : self.foursquareClientID, 
     "client_secret" : self.foursquareClientSecret, 
     "v" : "20140806" 
     ]) 
     .responseJSON { (request, response, data, error) in 
      println(request) 
      println(response) 
      println(error) 
      println(data) 
      if data != nil { 
       var jsonObj = JSON(data!) 
       // response is not in the form of an array? I think... thats why data is not setting .. I think "arrayValue" below is incorrect. should be something like dictionaryValue or stringValue 
       if let obj = jsonObj["response"]["venue"].arrayValue as [JSON]? { 
        self.responseitems = obj 
        self.tableView.reloadData() 
        println("Objis: \(obj)") 
       } 

      } 
    } 
} 

當我println("Obis: \(obj)")我得到的Objis: []控制檯輸出告訴我,我是從JSON響應抓住了錯誤的數據?下面是Foursquare Venue Detail API request

哦URL和self.responseitemsvar responseitems:[JSON] = []

請幫幫忙!由於

+0

你聲明的obj爲JSON數組,嘗試訪問數組中的JSON類型之一。例如:'println(「Objis:\(obj.first)」)'這將返回一個可選值,如果有可用項目,它將返回數組中的第一個項目,如果沒有可用的項目它將返回無 – milo526

+0

@ milo526你看過我提供的foursquare API響應鏈接嗎?鑑於該響應及其結構,對於我將obj聲明爲Array是否正確?或者我應該將obj聲明爲不同的SwiftyJSON類型?請記住self.responseitems –

+0

foursquare場地詳細信息API請求不適用於非四方會員。我沒有這樣的帳戶,所以無法看到它,也許你可以上傳API文檔中關於你的問題有趣的部分的屏幕截圖。 – milo526

回答

1

看看這個代碼:

let url = "Foursquare Venue Detail API request goes here" 
    Alamofire .request(.GET, url) .responseJSON(options: nil) { (_, _, data, error) -> Void in 
     if error != nil { 
      println(error?.localizedDescription) 
     } else if let data: AnyObject = data { 
      let jObj = JSON(data) 
      if let venue = jObj["response"]["venue"].dictionary { 
       println(venue) 
      } 

     } 
    } 

所以這裏的主要區別是,數據是一個字典,而不是一個數組。

順便說一句,考慮重裝主隊列表視圖,因爲這會影響UI:

dispatch_async(dispatch_get_main_queue()) { 
    self.tableView.reloadData() // Update UI 
} 
+0

這適用於'println(場地)'。我正在用響應中的信息更新UITableView。 UITableView有3個單元,每個單元都有自己的自定義類。 「VenueDetailHeaderCell」和「VenueDetailInformationCell」等,它們將根據響應抓取的項目進行更新。這就是我在上面的代碼中用'self.responseitems = obj'做的事情,在那裏我會像'cell = tableView.dequeueReusableCellWithIdentifier(「VenueDetailHeaderCell」,forIndexPath:indexPath)那樣做! VenueDetailHeaderCell cell.headerInfo = self.responseitems [indexPath.row]' –

+0

我剛剛在這裏創建了一個關於我的評論的新問題:http://stackoverflow.com/questions/29725241/how-can-i-use-swiftyjson- dictionaryvalue作爲一種可用串換一個-的UILabel –