JSONSerialization和EXC_BAD_ACCESS

时间:2015-03-08 00:25:47

标签: ios json swift nsjsonserialization

我在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"}]

提前致谢。

2 个答案:

答案 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