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

Bot*_*Bot 4 json objective-c ios 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];
Run Code Online (Sandbox Code Playgroud)

hyp*_*ypt 28

这不会"出错",如果JSON无效,它将返回nil.因此,测试它是否是有效的JSON将是:

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

如果它确实返回,nil那么你可以检查error出错了.


All*_*ian 7

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

NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]];
id jsonObj = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
BOOL isValid = [NSJSONSerialization isValidJSONObject:jsonObj];
Run Code Online (Sandbox Code Playgroud)

编辑:(在hypercrypts'评论后)

Hypercrypt是对的(我真的无法理解我是如何错过的)......即使我的回答似乎有效,但这是错误的.什么isValidJSONObject:方法可以检查对象是否可以序列化为JSON而不是反过来.所以他的回答是你正在寻找的.你可以使用这种方法,如果你从json有效载荷中获取一个可变副本,改变它,然后想要检查是否可以安全地尝试将其重新序列化为JSON字符串.但最重要的是,hypercrypt的答案是正确的,我认为将他的答案标记为正确而不是我的答案是公平的.无论如何,抱歉任何混乱和@hypercrypt感谢指出:)

  • 这不是` - [NSJSONSerialization isValidJSONObject:]`的用途.它是检查任意数组或字典是否有效转换为JSON字符串. (2认同)