Ara*_*fal 8 xcode json ios swift
我试图从服务器中保存的数据创建一个字典,我收到的数据,但我不能将数据转换为NSDictionary,我相信它是在一个NSData对象中保存
let JSONDictionary: Dictionary = NSJSONSerialization.JSONObjectWithData(JSONData!, options: nil, error: &error) as NSDictionary
Run Code Online (Sandbox Code Playgroud)
这行代码就是给我一个问题的代码,它引发了一个问题BAD_EXEC_INSTRUCTION.
我的问题:我怎样才能JSON变成一个NSDictionary?
Mat*_*uch 10
您的代码不会执行任何错误处理.但它可以(并且如果这些数据来自Web服务,将会以多种方式失败).
您应该使用Swifts条件转换和它的可选绑定功能.
可选绑定if let JSONData = JSONData检查JSONData不是nil.JSONData!如果无法接收数据,您使用的force unwrap()可能会崩溃.
可选绑定if let 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")
}
Run Code Online (Sandbox Code Playgroud)
您可以将check 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")
}
Run Code Online (Sandbox Code Playgroud)
确保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)")
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
23255 次 |
| 最近记录: |