如何使用SwiftyJSON获取正确的JSON响应?

时间:2015-04-18 19:13:04

标签: uitableview swift alamofire swifty-json

我正在使用alamofire发出GET请求并尝试使用SwiftyJSON转换为JSON。我可以成功发出请求,但我无法将响应转换为可用的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

的网址

哦,self.responseitemsvar responseitems:[JSON] = []

请帮忙!感谢

1 个答案:

答案 0 :(得分: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)
            }

        }
    }

所以这里的主要区别是数据是dict,而不是数组。

顺便提一下,考虑重新加载主队列中的表视图,因为这会影响UI:

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