2017-03-08 10 views
-1

redditのJsonデータを解析して、その情報をテーブルビューに表示しようとしています。 (https://api.reddit.com)。私は情報が実際に「redditALL」定数を通じて来ているが、私はJSONSerialization後に間違ったをやっているかわからないんだけど、事実を知っているReddit:JSONの迅速な解析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 
    } 

:これまでのところ、これは私のコードは次のようになります 。 JSONの構文解析を迅速に理解できるようにするためのリンクがあれば、本当にありがとうと思います。

+0

jsonのデータ構造を表示できますか? –

答えて

0

まず、それがその使用URLSessionするのではなく、あなたのMainスレッドをブロックしますのでURLからJSONを取得するためにData(contentsOf:)を使用しないでください。

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とコードが一致していない可能性があります。