我一直在尝试使用我正在处理的示例swift iOS应用程序上的示例Rest请求。我已经从我看过的一些教程中提到说这可行,但我的应用程序似乎崩溃了
var jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as NSDictionary
swift_dynamicCast库中抛出异常。我可以将我的响应转换为String而没有问题,字符串是一个有效的json数组。任何想法?
以下是我的测试功能的完整代码。
let url:NSURL = NSURL(string:"http://jsonplaceholder.typicode.com/comments")
let request:NSURLRequest = NSURLRequest(URL:url)
let queue:NSOperationQueue = NSOperationQueue()
NSURLConnection.sendAsynchronousRequest(request, queue: queue, completionHandler:{ (response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in
var stringData :NSString = NSString(data:data, encoding:NSUTF8StringEncoding)
println(stringData)
var err: NSError?
var jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as NSDictionary
if(err?) {
println("JSON Error (err!.localizedDescription)")
}
println("AsSynchronous\(jsonResult)")
})
答案 0 :(得分:4)
更改
var jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as NSDictionary
到
if let jsonResult: AnyObject = NSJSONSerialization.JSONObjectWithData(data,options:nil,error: nil) {
if jsonResult is NSDictionary {
var myDict: NSDictionary = jsonResult as NSDictionary
println("myDict:\(myDict)")
}
else if jsonResult is NSArray {
var myArray: NSArray = jsonResult as NSArray
println("myArray:\(myArray)")
}
}
一切正常。它能够将其解析为NSArray而不是NSDictonary。根据堆栈溢出聊天中的代码,我现在拥有的代码将适用于Http请求返回的JSON数组和JSON对象。
答案 1 :(得分:1)
作为您自己的解决方案的补充,您可以使用if let
语句使您的投射更简洁。
if let jsonResult: AnyObject = NSJSONSerialization.JSONObjectWithData(data,options:nil,error: nil) {
if let myDict = jsonResult as? NSDictionary {
println("myDict:\(myDict)")
}
else if let myArray = jsonResult as? NSArray {
println("myArray:\(myArray)")
}
}
此示例中的if let
语句检查jsonResult是否可以强制转换为NSDictionary或NSArray,以及是否可以将myDict
/ myArray
设置为jsonResult的类型转换版本并输入if身体。如果他们无法将代码转换为if,那么就不会被执行。它的功能与您的解决方案相同,但对我来说感觉更简洁,更清洁。
此外,由于您使用了NSJSONReadingOptions.MutableContainers
选项,因此您可能需要投放NSMutableArray
和NSMutableDictionary
。
答案 2 :(得分:1)
修改上述答案以适应最新的Swift 2.1版本 如上所述,类型转换为NSArray, 它工作并处理json数据
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let url = NSURL(string: "http://jsonplaceholder.typicode.com/comments")
// or use this http://jsonplaceholder.typicode.com/comments or this http://puppygifs.tumblr.com/api/read/json
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithURL(url!, completionHandler: { (data, response, error) -> Void in
if error != nil {
print(error)
} else {
do {
let jsonResult = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as! NSArray
// print(jsonResult)
print(jsonResult[0])
} catch {
print("my error")
}
}
})
task.resume()
}
}