在 swift 2.0 中解析 JSON 时出错

Posted

技术标签:

【中文标题】在 swift 2.0 中解析 JSON 时出错【英文标题】:Error while parsing JSON in swift 2.0 【发布时间】:2016-04-16 06:44:28 【问题描述】:

我正在尝试下载文章列表并将其插入到表格视图中。但是,我似乎在检索 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 方法来完成这一切。

提前致谢!

【问题讨论】:

您好,由于您的结果变量可能为 null 并且是可选的,因此 for...in 指令也应该使用带有可选包装器的变量,即“as?”。试一试... 【参考方案1】:

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 中始终使用本机集合类型,除非您绝对别无选择。

【讨论】:

【参考方案2】:

试试这个代码,

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!)")

希望对你有帮助

【讨论】:

以上是关于在 swift 2.0 中解析 JSON 时出错的主要内容,如果未能解决你的问题,请参考以下文章

使用 swiftyJSON 在 Swift 2.0 中解析 JSON 时获取空值

在swift ios中解析NSJSON序列化中的json时出错

解析 JSON 数据时出错(Swift 4 Playground)

使用 Swift 2.0 解析并跳转到 JSON 文件中的下一个块

尝试在 swift 2.0 中执行 GET 请求时出错

我在 Swift 5 上解码 json 时出错