在 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)