我在php服务的帮助下从MYSQL数据库中获取一些信息。最后,我将echo json_encode($resultArray)
推送到我的应用。现在我遇到了JSONSerialization的问题,这是我的代码。
If ( urlData != nil ) {
let res = response as NSHTTPURLResponse!;
NSLog("Response code: %ld", res.statusCode);
if (res.statusCode >= 200 && res.statusCode < 300)
{
var responseData:NSString = NSString(data:urlData!, encoding:NSUTF8StringEncoding)!
NSLog("Response ==> %@", responseData);
var error: NSError?
let jsonData2:NSDictionary = NSJSONSerialization.JSONObjectWithData(urlData!, options:NSJSONReadingOptions.MutableContainers , error: &error) as NSDictionary
let success:NSInteger = jsonData2.valueForKey("IdUser") as NSInteger
...
使用此代码,我会在EXC_BAD_ACCESS
行中收到错误消息NSJSONSerialization
。有人知道为什么吗?
responseDate具有以下示例值:
[{"IdUser":"2","preName":"Max","lastName":"Muster"}]
提前致谢。
答案 0 :(得分:1)
您的JSON响应不是NSDictionary
。这是一个数组。现在这个数组有一个项目,它本身就是一个字典。但是你必须先解析数组:
let array = NSJSONSerialization.JSONObjectWithData(urlData!, options:nil, error: &error) as NSArray
如果你想获取字典,你可以从数组中获取第一项:
let dictionary = array[0] as NSDictionary
如果您想要IdUser
的字段值,则获取该字符串值,然后调用integerValue
:
let idUser = dictionary["IdUser"]?.integerValue
顺便说一下,如果响应可能会以其格式出现偏差,那么您可能需要小心解析响应,使用可选绑定来优雅地处理数据的缺失。您期望的格式,例如:
var error: NSError?
if let array = NSJSONSerialization.JSONObjectWithData(urlData!, options:nil, error: &error) as? [[String: AnyObject]] {
if let dictionary = array.first {
if let idUser = dictionary["IdUser"]?.integerValue {
// `IdUser` definitely found; now check the value here
}
}
}
答案 1 :(得分:0)
快速使用SwiftyJSON解析json的简单方法,但如果你不想要它,你可以这样做
if let jsonData2 = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions(0), error: nil) as? AnyObject {
}
但我强烈建议您使用SwiftyJSON