Ios 使用Swift将JSON字符串转换为NSDictionary
我正在尝试从服务器中保存的数据创建字典,我收到了数据,但无法将数据转换为Ios 使用Swift将JSON字符串转换为NSDictionary,ios,json,xcode,swift,Ios,Json,Xcode,Swift,我正在尝试从服务器中保存的数据创建字典,我收到了数据,但无法将数据转换为NSDictionary,我相信它保存在NSData对象中 let JSONDictionary: Dictionary = NSJSONSerialization.JSONObjectWithData(JSONData!, options: nil, error: &error) as NSDictionary 这行代码就是我遇到问题的代码,它抛出了一条错误的执行指令 我的问题是:如何将JSON转换为NSDict
NSDictionary
,我相信它保存在NSData
对象中
let JSONDictionary: Dictionary = NSJSONSerialization.JSONObjectWithData(JSONData!, options: nil, error: &error) as NSDictionary
这行代码就是我遇到问题的代码,它抛出了一条错误的执行指令
我的问题是:如何将
JSON
转换为NSDictionary
?这里jsonResult
将在NSDictionary
中给出响应:
let url = NSURL(string: path)
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithURL(url!, completionHandler: {data, response, error -> Void in
println("Task completed")
if(error != nil) {
// If there is an error in the web request, print it to the console
println(error.localizedDescription)
}
var err: NSError?
var jsonResult = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as NSDictionary
if(err != nil) {
// If there is an error parsing JSON, print it to the console
println("JSON Error \(err!.localizedDescription)")
}
})
task.resume()
您的代码不会进行任何错误处理。但它可以(如果这些数据来自web服务,它将)以多种方式失败
如果让JSONData=JSONData检查JSONData是否为nil,则可选绑定
。如果无法接收数据,您使用的强制展开(JSONData!
)可能会崩溃
如果让json=NSJSONSerialization.JSONObjectWithData
检查数据是否可以转换为json对象,则可选绑定。条件强制转换as?NSDictionary
检查JSON对象是否实际上是字典。如果当前不使用这些检查,则将对象强制转换为NSDictionary。如果对象不是有效的json,或者不是字典,则会崩溃
我想推荐如下:
var error: NSError?
if let JSONData = JSONData { // Check 1
if let json: AnyObject = NSJSONSerialization.JSONObjectWithData(JSONData, options: nil, error: &error) { // Check 2
if let jsonDictionary = json as? NSDictionary { // Check 3
println("Dictionary received")
}
else {
if let jsonString = NSString(data: JSONData, encoding: NSUTF8StringEncoding) {
println("JSON String: \n\n \(jsonString)")
}
fatalError("JSON does not contain a dictionary \(json)")
}
}
else {
fatalError("Can't parse JSON \(error)")
}
}
else {
fatalError("JSONData is nil")
}
您可以将检查2和检查3合并为一行,并检查NSJSONSerialization是否可以直接创建NSDictionary:
var error: NSError?
if let JSONData = JSONData { // Check 1.
if let JSONDictionary = NSJSONSerialization.JSONObjectWithData(JSONData, options: nil, error: &error) as? NSDictionary { // Check 2. and 3.
println("Dictionary received")
}
else {
if let jsonString = NSString(data: JSONData, encoding: NSUTF8StringEncoding) {
println("JSON: \n\n \(jsonString)")
}
fatalError("Can't parse JSON \(error)")
}
}
else {
fatalError("JSONData is nil")
}
确保在您的生产代码中用适当的错误处理替换fatalError
Swift 2的更新。
现在您必须在try-catch块中使用它
do {
let responseObject = try NSJSONSerialization.JSONObjectWithData(data, options: []) as! [String:AnyObject]
} catch let error as NSError {
print("error: \(error.localizedDescription)")
}
您能否发布一些代码,说明如何声明NSData对象以及在何处/如何初始化它。第二个错误中的注释应为://如果解析JSON时出错,这一行永远不会到达,因为当您尝试打开一个nil值时,代码出错
@zaid pathan我已取消您的编辑,因为它引入了一个问题。如果删除N错误向下广播,则无法再调用错误上的本地化描述
方法。无论如何,请避免对代码进行修改。谢谢。:)