检查API的响应是否是有效的JSON

时间:2012-03-29 22:00:41

标签: objective-c ios json ios5 nsjsonserialization

NSJSONSerialization是否有办法检查NSData是否为有效的JSON?如果API由于某种原因返回无效的JSON,我不希望应用程序出错。

NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]];
NSError *error;
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];

3 个答案:

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

编辑:想想看,如果遇到错误,'错误'是一个错误对象。因此,即使没有抛出任何东西,您也可以检查数据是否有效。