2016-04-16 5 views
0

Я пытаюсь загрузить список статей и вставить их в табличный вид. Однако, похоже, у меня проблема с получением файла JSON и его разбор.Ошибка при разборе JSON в swift 2.0

Мой код выглядит следующим образом:

override func viewDidLoad() { 
     super.viewDidLoad() 

     self.downloadArticles() 

     self.tableView.reloadData() 
    } 


    func downloadArticles(){ 
     var url: NSURL 
     url = NSURL(string: "https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20feed%20where%20url=%27www.abc.net.au%2Fnews%2Ffeed%2F51120%2Frss.xml%27&format=json")! 
     print(url) 
     let task = NSURLSession.sharedSession().dataTaskWithURL(url){ 
      (data, response, error) in 
      if (error != nil){ 
       print("Error \(error)") 
      } else{ 
       self.parseArticleJSON(data!) 
      } 
      self.syncCompleted = true 
      self.tableView.reloadData() 
     } 
     task.resume() 
    } 

    func parseArticleJSON(articleJSON:NSData) 
    { 
     do{ 

      let result = try NSJSONSerialization.JSONObjectWithData(articleJSON, options: NSJSONReadingOptions.MutableContainers) as? NSArray 

      //let jsonData:NSArray = (try NSJSONSerialization.JSONObjectWithData(articleJSON, options:NSJSONReadingOptions.MutableContainers) as? NSArray)! 

      let newArticlesArray = result as NSArray! 
      //NSLog("Found \(newArticlesArray.count) new articles!") 
      for article in (newArticlesArray as NSArray as! [NSDictionary]) 
      { 
       print (article.objectForKey("title")! as? String) 

       //let a = Article (t: <#T##String#>, da: <#T##String#>, de: <#T##String#>, i: <#T##NSURL#>) 

       //articlesArray.addObject(a); 
      } 
     }catch { 
      print("JSON Serialization error") 
     } 

    } 

В методе parseArticleJSON (я знаю, что это не все полностью закончена). Я получаю ошибку в строке:

for article in (newArticlesArray as NSArray as! [NSDictionary]) 

он говорит:

fatal error: unexpectedly found nil while unwrapping an Optional value 

Я попытался сделать некоторые исследования здесь, на этих форумах, но я не смог найти ответ, который бы помочь мне поэтому мне было интересно, сможет ли кто-нибудь помочь мне.

Мне нужно использовать собственные быстрые методы JSON, чтобы сделать все это.

Заранее благодарен!

+0

Привет, поскольку ваша переменная result может быть нулевой и необязательной, инструкция for ... должна использовать переменные с необязательными обертками тоже i.e 'as?'. Дайте ему попробовать ... –

ответ

2

JSON гораздо больше вложенной:

typealias JSONDictionary = Dictionary<String,AnyObject> 

func parseArticleJSON(articleJSON:NSData) { 
    do { 
    let jsonObject = try NSJSONSerialization.JSONObjectWithData(articleJSON, options: []) 
    if let jsonResult = jsonObject as? JSONDictionary, 
     query = jsonResult["query"] as? JSONDictionary, 
     results = query["results"] as? JSONDictionary, 
     newArticlesArray = results["item"] as? [JSONDictionary] { 
     for article in newArticlesArray { 
     print(article["title"] as! String) 
     } 
    } 
    } catch let error as NSError { 
    print(error) 
    } 
} 

Для этого глубоко вложенного JSON рекомендуется использовать библиотеку как SwiftyJSON.

Поскольку код считывает только объект JSON, параметр MutableContainers не нужен вообще, и в Swift всегда используются собственные типы коллекций, если у вас нет абсолютно никакого выбора.

+0

Спасибо, что отлично работает –

0

попробуйте этот код,

if let jsonObject: AnyObject = NSJSONSerialization.JSONObjectWithData(articleJSON, options: nil, error:&error) { 
    if let dict = jsonObject as? NSDictionary { 
     println(dict) 
    } else { 
     println("not a dictionary") 
    } 
} else { 
    println("Could not parse JSON: \(error!)") 
} 

надеюсь, что его полезно

Смежные вопросы