【问题标题】:How can I grab the correct JSON response using SwiftyJSON?如何使用 SwiftyJSON 获取正确的 JSON 响应?
【发布时间】:2015-04-18 19:13:04
【问题描述】:

我正在使用 alamofire 发出 GET 请求,并尝试使用 SwiftyJSON 转换为 JSON。我可以成功发出请求,但无法将响应转换为可用的 JSON 对象。

我正在尝试从四方场地详细信息响应中获取数据,并使用有关场地的适当信息更新 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] = []

请帮忙!谢谢

【问题讨论】:

  • 您将 obj 声明为 Json 数组,尝试访问数组中的一种 JSON 类型。例如:println(“Objis: \(obj.first)”) 这将返回一个可选值,如果有可用项,它将返回数组中的第一项,如果没有可用项,它将返回 nil
  • @milo526 你看过我提供的foursquare API 响应链接了吗?鉴于该响应及其结构,我将 obj 声明为数组是否正确?或者我应该将 obj 声明为不同的 SwiftyJSON 类型?请记住 self.responseitems
  • foursquare 场地详情 API 请求不适用于非foursquare 会员。我没有这样的帐户,所以无法看到它,也许您可​​以上传 API 文档中对您的问题感兴趣的部分的屏幕截图

标签: uitableview swift alamofire swifty-json


【解决方案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
}

【讨论】:

  • 这适用于println(venue)。我正在使用响应中的信息更新 UITableView。 UITableView 有 3 个单元格,每个单元格都有自己的自定义类。 “VenueDetailHeaderCell”和“VenueDetailInformationCell”等将根据从响应中抓取的项目进行更新。这就是我在上面的代码中尝试使用 self.responseitems = obj 做的事情,然后我会在其中执行类似 cell = tableView.dequeueReusableCellWithIdentifier("VenueDetailHeaderCell", forIndexPath: indexPath) as! VenueDetailHeaderCell cell.headerInfo = self.responseitems[indexPath.row] 的操作
  • 我刚刚针对我的上述评论提出了一个新问题:stackoverflow.com/questions/29725241/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-30
相关资源
最近更新 更多