在swift 2.0中解析JSON时出错

时间:2016-04-16 06:44:29

标签: ios arrays json swift parsing

我正在尝试下载文章列表并将其插入表格视图中。但是,我似乎在检索JSON文件并解析它时遇到了问题。

我的代码如下:

    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

我曾尝试在这些论坛上做一些研究,但我找不到任何对我有帮助的回复,所以我想知道是否有人能够帮助我。

我需要使用原生的swift JSON方法来完成所有这些。

提前致谢!

2 个答案:

答案 0 :(得分:2)

JSON更嵌套:

JSONArray arr = new JSONArray();
for (int i = 0 ; i < hitsArray.length(); i++) {
    JSONObject jObject = hitsArray.getJSONObject(i);
    arr.put(jObject.get("_source"));         
}    

request.setAttribute("jsonObject", arr);
RequestDispatcher dispatcher = request.getRequestDispatcher("index.jsp");
dispatcher.forward(request, response);

对于深度嵌套的JSON,建议使用像SwiftyJSON这样的库。

由于代码只是读取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) } } ,而Swift总是使用本机集合类型,除非你绝对没有选择。

答案 1 :(得分: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!)")
}

希望它有用