Reddit:Swift 3 中的 JSON 解析

Posted

技术标签:

【中文标题】Reddit:Swift 3 中的 JSON 解析【英文标题】:Reddit: JSON Parsing in swift 3 【发布时间】:2017-03-08 03:05:33 【问题描述】:

我正在尝试找到一种方法来解析 reddit 上的一些 Json 数据并在表格视图中显示信息。 (https://api.reddit.com)。 到目前为止,这就是我的代码的样子:

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 解析,我将不胜感激,谢谢。

【问题讨论】:

你能展示你的json数据结构吗? 【参考方案1】:

首先不要使用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()

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于Reddit:Swift 3 中的 JSON 解析的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3 中的 JSON 解析

Swift 3.0 中的 JSON 解析失败

swift 3中的JSON解析

iOS swift 3.0 本地 JSON 解析崩溃

如何在 Swift 3 中使用 Alamofire 4 解析这个 json?

JSON不会在swift 3中解析为TableView