Проверьте, является ли ответ от API допустимым JSON - PullRequest
3 голосов
/ 30 марта 2012

Можно ли с помощью NSJSONSerialization проверить, является ли NSData допустимым JSON? Я не хочу, чтобы приложение выдавало ошибку, если API по какой-либо причине возвращает неверный JSON.

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

Ответы [ 3 ]

27 голосов
/ 30 марта 2012

Это не будет «ошибкой», просто вернет ноль, если JSON не действителен. Таким образом, проверка на допустимость JSON будет такой:

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

Если он вернет nil, тогда вы можете проверить error, чтобы увидеть, что пошло не так.

6 голосов
/ 30 марта 2012

NSJSONSerialization Класс имеет метод, чтобы сделать именно это ... ( РЕДАКТИРОВАТЬ: нет, это не ...)

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

РЕДАКТИРОВАТЬ: (после комментария гиперкриптов)

Гиперкрипт прав (я действительно не могу понять, как я это пропустил) ... Хотя мой ответ, кажется, работает, он неправильный .Метод isValidJSONObject: проверяет, можно ли сериализовать объект в JSON, а не наоборот.Поэтому его ответ - то, что вы ищете.Однако вы можете использовать этот метод в случае, если вы извлекаете изменяемую копию из полезной нагрузки json, изменяете ее, а затем хотите проверить, безопасно ли пытаться повторно сериализовать ее обратно в строку JSON.Но суть в том, что ответ гиперкрипта является правильным, и я думаю, что было бы более чем справедливо отметить его ответ правильным, а не мой.В любом случае, извините за путаницу и спасибо @hypercrypt за то, что указал на это:)

0 голосов
/ 30 марта 2012

На самом деле нет способа проверить данные без создания объекта с помощью NSJSONSerialization; Я бы поставил это на пробу. Если вы окажетесь в блоке catch, это недопустимый JSON.

РЕДАКТИРОВАТЬ: если подумать, если он обнаружил ошибку, «error» является объектом ошибки Поэтому, даже если ничего не выброшено, вы можете проверить это, чтобы убедиться, что данные действительны.

...