NSJSONSerialization
是否有办法检查NSData
是否为有效的JSON?如果API由于某种原因返回无效的JSON,我不希望应用程序出错。
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]];
NSError *error;
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
答案 0 :(得分:27)
这不会“出错”,如果JSON无效,它将返回nil。因此,测试它是否是有效的JSON将是:
NSError *error;
if ([NSJSONSerialization JSONObjectWithData:data
options:kNilOptions
error:&error] == nil)
{
// Handle error
}
如果它确实返回nil
,那么您可以查看error
以查看出现了什么问题。
答案 1 :(得分:6)
NSJSONSerialization
班级有一种方法可以做到这一点...(编辑:不,它没有......)
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]];
id jsonObj = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
BOOL isValid = [NSJSONSerialization isValidJSONObject:jsonObj];
编辑:(在超链接评论后)
Hypercrypt是对的(我真的无法理解我是如何错过的)...
即使我的答案似乎有效,但错误。
isValidJSONObject:
方法的作用是检查对象是否可以序列化为JSON,而不是相反。所以他的回答是你正在寻找的。你可以使用这种方法,如果你从json有效载荷中获取一个可变副本,改变它,然后想要检查是否可以安全地尝试将其重新序列化为JSON字符串。但最重要的是,hypercrypt的答案是正确的,我认为将他的答案标记为正确而不是我的答案是公平的。无论如何,抱歉任何混乱和@hypercrypt感谢指出:)
答案 2 :(得分:0)
在没有使用NSJSONSerialization创建对象的情况下,没有办法检查数据;我会把它放在试一试。如果你最终进入catch块,它就不是JSON。
编辑:想想看,如果遇到错误,'错误'是一个错误对象。因此,即使没有抛出任何东西,您也可以检查数据是否有效。