6

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

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

3 回答 3

30

这不会“出错”,如果 JSON 无效,它只会返回 nil。因此,查看它是否为有效 JSON 的测试将是:

NSError *error;
if ([NSJSONSerialization JSONObjectWithData:data
                                    options:kNilOptions
                                      error:&error] == nil)
{
    // Handle error
}

如果它确实返回nil,那么您可以检查一下error出了什么问题。

于 2012-03-29T22:13:14.507 回答
7

NSJSONSerialization类有一种方法可以做到这一点......(编辑:不,它没有......)

NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]];
id jsonObj = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
BOOL isValid = [NSJSONSerialization isValidJSONObject:jsonObj];

编辑:(在 hypercrypts 的评论之后)

Hypercrypt 是对的(我真的不明白我是怎么错过的)......即使我的答案似乎有效,但它是错误的。方法是isValidJSONObject:检查一个对象是否可以序列化为 JSON,而不是反过来。所以他的答案就是你要找的。如果您从 json 有效负载中获取可变副本,对其进行变异,然后想要检查尝试将其重新序列化回 JSON 字符串是否安全,则可以使用此方法。但底线是 hypercrypt 的答案是正确的,我认为将他的答案标记为正确而不是我的答案是非常公平的。无论如何,对于任何混乱和@hypercrypt感谢您指出这一点:)

于 2012-03-30T10:41:39.753 回答
0

如果不使用 NSJSONSerialization 创建对象,实际上是没有办法检查数据的;我会把它放在一个try-catch中。如果您最终进入 catch 块,则它不是有效的 JSON。

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

于 2012-03-29T22:07:57.823 回答