JSONSerialization 和 EXC_BAD_ACCESS
Posted
技术标签:
【中文标题】JSONSerialization 和 EXC_BAD_ACCESS【英文标题】:JSONSerialization and EXC_BAD_ACCESS 【发布时间】:2015-03-08 00:25:47 【问题描述】:我在 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
...
使用此代码,我在NSJSONSerialization
的行中收到错误消息EXC_BAD_ACCESS
。有人知道为什么吗?
responseDate 有这个示例值:
["IdUser":"2","preName":"Max","lastName":"Muster"]
提前致谢。
【问题讨论】:
我找到了解决方案。当响应数据有括号时,序列化不起作用。这是正常的还是有办法在 xcode 中处理? 向我们展示响应数据。并告诉我们error
NSJSONSerialization 正在返回什么。
【参考方案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
【讨论】:
【参考方案2】:一种快速解析 json 的简单方法,使用 SwiftyJSON 但如果你不想要它,你可以这样做
if let jsonData2 = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions(0), error: nil) as? AnyObject
但我强烈建议使用SwiftyJSON
【讨论】:
除非你想尝试对 SwiftyJSON 对象进行排序——你需要转换回 NSArray/NSDictionary。这很慢……因为它,我实际上已经停止使用 SwiftyJSON。本机对象要快得多。如果需要排序,不要使用 Swifty JSON!以上是关于JSONSerialization 和 EXC_BAD_ACCESS的主要内容,如果未能解决你的问题,请参考以下文章
JSONSerialization 在应用程序中返回 false,在邮递员中返回 true
JSONSerialization.jsonObject 不接受我的参数
JSONSerialization 没有在服务器发送时序列化数据
JSONSerialization.jsonObject 返回 nil