没有从JSON Call获取数据

时间:2015-06-24 07:13:11

标签: ios json swift

我为学习目的创建了一个小应用程序,应该从JSON文件中获取数据并将其显示在tableview中。

我不确定如何从JSON访问我的数据。如果有人可以帮助我,那会更高兴。

[
  {
    "title": "dolore laboris ea adipisicing",
    "description": "Ullamco adipisicing aute deserunt id do eu aliqua deserunt deserunt quis elit. Irure excepteur aliquip mollit tempor. Minim est nisi aute do tempor nisi aliquip pariatur. Laboris qui duis consequat magna qui. Proident nisi duis Lorem officia eiusmod exercitation aliqua dolore sunt esse sunt consectetur ut.",
    "images": [
      {
        "index": 0,
        "title": "laborum minim deserunt elit",
        "pubDate": 1421120486130,
        "picture": "http://lorempixel.com/500/500/nightlife/",
        "caption": "deserunt proident cillum laboris duis ut minim est"
      },

这是我的JSON文件,我想访问属性标题以及图片。

我在做什么:

我有Parser类来访问JSON

与基本网址一致

正在打电话的功能

    func getRandomUser(onCompletion: (JSON) -> Void) {
        let route = baseURL
        makeHTTPGetRequest(route, onCompletion: { json, err in
            onCompletion(json as JSON)
        })
    }

and a normal **makeHTTPGetRequest** function.


And this is how i try to fill my table 

    func addDummyData() {
        RestParser.sharedInstance.getTableViewData { json in
        let results = json["images"]
            for (index: String, subJson: JSON) in results {
                let user: AnyObject = subJson["images"].object
                self.items.addObject(user)
                dispatch_async(dispatch_get_main_queue(),{
                    tableView?.reloadData()
                })
            }
        }
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.items.count;
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        var cell = tableView.dequeueReusableCellWithIdentifier("CELL") as? UITableViewCell

        if cell == nil {
            cell = UITableViewCell(style: UITableViewCellStyle.Value1, reuseIdentifier: "CELL")
        }

        let user:JSON =  JSON(self.items[indexPath.row])

        let picURL = user["picture"].string
        let url = NSURL(string: picURL!)
        let data = NSData(contentsOfURL: url!)

        cell!.textLabel?.text = user["title"].string
        cell?.imageView?.image = UIImage(data: data!)


        return cell!
    }

没有太大成功..我没有得到任何回报

我如何尝试调用数据

func getTableViewData(onCompletion:(JSON) -> Void){
        let route = baseURL
        makeHTTPGetRequest(route, onCompletion: { json, err in
            onCompletion(json as JSON)
        })
    }

2 个答案:

答案 0 :(得分:1)

您似乎正在使用SwiftyJSON类来处理JSON字符串。

这里有一个解决方案,假设如下:

  • 具有此声明的变量

    var items : [JSON]() 
    
  • 函数RestParser.sharedInstance.getTableViewData返回SwiftyJSON兼容数据

  • 返回的SwiftyJSON对象是一个字典,其中包含一个包含一些属性的数组images

函数addDummyData通过图像数组进行迭代,并将JSON.dictionaries对象添加到items

  func addDummyData() {
    RestParser.sharedInstance.getTableViewData { json in
      let results = json["images"]
      for (index: String, user: JSON) in results {
        items.append(user)
      }
      dispatch_async(dispatch_get_main_queue(),{
        tableView?.reloadData()
      })
    }
  }

函数tableView:cellForRowAtIndexPath照常创建单元格,并将属性titlepicture分配给相应的单元格属性。

 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell = tableView.dequeueReusableCellWithIdentifier("CELL") as? UITableViewCell

    if cell == nil {
      cell = UITableViewCell(style: UITableViewCellStyle.Value1, reuseIdentifier: "CELL")
    }

    let user = items[indexPath.row]

    if let picURL = user["picture"].string, url = NSURL(string: picURL) {
      if let data = NSData(contentsOfURL: url) {
        cell!.imageView?.image = UIImage(data: data)
      }
    }
    cell!.textLabel?.text = user["title"].string

    return cell!
  }

答案 1 :(得分:0)

您的JSON正在返回一个数组,因此您需要遍历该数组才能访问其项目。

func addDummyData() {
    RestParser.sharedInstance.getTableViewData { json in
    // Iterate through the JSON response array
    for results in json {
     // You can now use the results objects to get "images" etc objects from the json.
    }
}