NSJSONSerialization NSJSONReadingAllowFragments чтение

В следующем коде для синтаксического анализа JSON, когда объекты отличаются от NSArray или NSDictionary, используется NSJSONReadingAllowFragments.

Приведенный ниже код работает нормально и выводит 32. но если заменить 32 на abcd, он выводит значение null. Любая идея, почему это значение null для строки abcd.

NSString *num=@"32";
NSError *error;
NSData *createdData = [num dataUsingEncoding:NSUTF8StringEncoding];
id response=[NSJSONSerialization JSONObjectWithData:createdData options:NSJSONReadingAllowFragments error:&error];
NSLog(@"Response= %@",response);

person weber67    schedule 06.06.2013    source источник
comment
Примечание. Если метод дает сбой, и вы не знаете, почему, и у этого метода есть параметр ошибки, почему бы вам не использовать этот параметр для получения информации о проблеме?   -  person Martin R    schedule 06.06.2013
comment
Спасибо, Мартин, я тоже добавлю.   -  person weber67    schedule 06.06.2013


Ответы (1)


Это связано с тем, что 32 является допустимым фрагментом JSON (числом), а abcd не является допустимым фрагментом JSON, поскольку все строки должны быть заключены в кавычки. Пытаться:

NSString *num=@"\"abcd\"";

который производит "abcd" вместо abcd.

(также имейте в виду, что возвращаемый объект на самом деле не является NSDictionary, поэтому объявление его как id имеет больше смысла)

person Community    schedule 06.06.2013
comment
Это был хороший ответ, жду, когда пройдет 3 минуты, чтобы я мог отметить ответ. - person weber67; 06.06.2013
comment
Неважно, как вы объявляете переменную, поэтому NSDictionary *responseDictionary в порядке, если вы ожидаете словарь. Но проверить это с помощью isKindOfClass: имело бы смысл. - person Martin R; 06.06.2013
comment
Да, я тоже добавлю. Ответ, который я получу, это NSDictionary, но добавление проверки спасет меня от исключения, если каким-то образом окажется, что он отличается от NSDictionary. - person weber67; 06.06.2013
comment
@MartinR Он работает как во время компиляции, так и во время выполнения, но использование id, а затем приведение к правильному типу после разумного использования -isKindOfClass: делает код более ясным, а также позволяет выполнять статическую типизацию и анализ. - person ; 06.06.2013
comment
@Bavarious Я вижу, что у меня сложный JSON, и использование следующего кода усложняет понимание, например: id allFriends=[response objectForKey:@friends]; if([allFriends isKindOfClass:[NSDictionary class]]){ NSDictionary allFriendsDictionary=(NSDictionary) allFriends; } . Здесь allFriends и allFriendsDictionary довольно запутанны, так что любые предложения по нему. В ответе много словарей и массивов. - person weber67; 06.06.2013
comment
@weber67 Если вы уверены, что синтаксический анализатор JSON возвращает словарь, можно использовать NSDictionary * в качестве типа данных, даже если вы по-прежнему отправляете его -isKindOfClass:, чтобы обеспечить соблюдение этого предположения. С другой стороны, если вы пишете что-то общее, что может быть либо словарем, либо строкой, как вы упомянули в своем вопросе, вам следует привести его к правильному типу, если вы собираетесь отправлять ему определенные методы NSDictionary или NSString. - person ; 07.06.2013