2017-03-08 109 views
-1

我试图找到一种方法来解析通过reddit上的一些Json数据并在表视图中显示信息。 (https://api.reddit.com)。 到目前为止,这是我的代码如下所示:Reddit:JSON在swift中解析3

var names: [String] = [] 
var comment: [String] = [] 

override func viewDidLoad() { 
     super.viewDidLoad() 
let url = URL(string: "https://api.reddit.com") 
     do{ 
      let reddit = try Data(contentsOf: url!) 
      let redditAll = try JSONSerialization.jsonObject(with: reddit, options: JSONSerialization.ReadingOptions.mutableContainers) as! [String : AnyObject] 
      if let theJSON = redditAll["children"] as? [AnyObject]{ 
       for child in 0...theJSON.count-1 { 
        let redditObject = theJSON[child] as! [String : AnyObject] 

        names.append(redditObject["name"] as! String) 
       } 
      } 
      print(names) 
     } 

     catch{ 
      print(error) 
     } 
    } 

//Table View 
func numberOfSections(in tableView: UITableView) -> Int { 
     return 1 

    } 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return names.count 
    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) 

     //Configure cells... 
     cell.textLabel?.text = names[indexPath.row] 
     cell.detailTextLabel?.text = comments[indexPath.row] 


     return cell 
    } 

我知道一个事实,信息实际上是通过“redditALL”未来不断,但我不知道我是JSONSerialization后做的不正确。 另外,如果有某种链接可以帮助我更好地理解JSON解析,我将非常感激。谢谢。

+0

你可以显示你的json数据结构吗? –

回答

0

首先不使用Data(contentsOf:)URL得到JSON,因为它会阻止你的Main线程而不是使用URLSession的。

现在要检索您的children数组,您需要首先访问data字典,因为其中包含children。所以试试这样。

let url = URL(string: "https://api.reddit.com") 
let task = Session.dataTask(with: url!) { data, response, error in 
    if error != nil{ 
     print(error.) 
    } 
    else 
    { 
     if let redditAll = (try? JSONSerialization.jsonObject(with: reddit, options: []) as? [String : Any], 
      let dataDic = redditAll["data"] as? [String:Any], 
      let children = dataDic["children"] as? [[String:Any]] { 

       for child in children { 
        if let name = child["name"] as? String { 
         names.append(name) 
        } 
       } 
       DispatchQueue.main.async { 
        self.tableView.reloadData() 
       } 
     } 
    } 
} 
task.resume() 
0

在Swift(Foundation)中解析JSON非常简单。你打电话JSONSerialization.jsonObject(with:),你会得到一个“对象图”。通常它是一个包含其他对象的字典或数组。您必须了解所获得的数据格式,才能将结果转换为适当的类型并遍历对象图。如果您投错,您的代码将无法按预期运行。你应该向我们展示你的JSON数据。您的JASON和您的代码可能存在不匹配。