TouchJSON, имеющий дело с NSNull - PullRequest
       13

TouchJSON, имеющий дело с NSNull

16 голосов
/ 19 апреля 2011

Привет Я использую TouchJSON для десериализации некоторых JSON. Я использовал его в прошлом, и в тех случаях я имел дело с появлением NSNull вручную. Я бы подумал, что автору тоже пришлось иметь дело с этим, так что повторное выполнение этого было бы просто накладным. Затем я нашел это в документации:

Как избежать значений NSNull в выводе.

NSData *theJSONData = /* some JSON data */
CJSONDeserializer *theDeserializer = [CJSONDeserializer deserializer];
theDeserializer.nullObject = NULL;
NSError *theError = nil;
id theObject = [theDeserializer deserialize:theJSONData error:&theError];}

Насколько я понимаю, пользователь класса может передать нулевой указатель в стиле C десериализатору, и когда он встретит NSNull, он вставит переданные ему значения (NULL). Поэтому позже, когда я буду использовать значения, я не получу NSNull, но NULL.

Это кажется странным, возвращаемое значение - NSDictionary, который может содержать только объекты, не должно ли значение по умолчанию «nil» вместо этого?

Если это NULL, могу ли я проверить такие значения?

if([jsonDataDict objectForKey:someKey] == NULL)

Казалось бы, логичнее было бы сделать это:

if(![jsonDataDict objectForKey:someKey])

Нет, чтобы упомянуть все случаи, когда допускается передача nil, но передача NULL вызывает сбой.

Или я могу просто передать nil десериализатору?

Многое из этого связано с тем, что я все еще борюсь с nil, NULL, [NSNULL null], возможно, я не вижу потенциальных предостережений при использовании nil.

Ответы [ 3 ]

48 голосов
/ 19 апреля 2011

Для другой библиотеки JSON, но с теми же проблемами, я создал следующую категорию в NSDictionary:

@implementation NSDictionary (Utility)

// in case of [NSNull null] values a nil is returned ...
- (id)objectForKeyNotNull:(id)key {
   id object = [self objectForKey:key];
   if (object == [NSNull null])
      return nil;

   return object;
}

@end

Всякий раз, когда я имею дело с данными JSON из указанной библиотеки, я получаю значения, подобные этому:

NSString *someString = [jsonDictionary objectForKeyNotNull:@"SomeString"];

Таким образом код в моих проектах становится намного чище, и в то же время мне не нужно думать о работе со значениями [NSNull null] и тому подобным.

15 голосов
/ 19 апреля 2011

nil и NULL фактически равны нулю, поэтому на практике они взаимозаменяемы. Но вы правы, для согласованности документация для TouchJSON должна была использовать theDeserializer.nullObject = nil вместо NULL.

Теперь, когда вы это сделаете, ваш второй предикат на самом деле работает нормально:

if (![jsonDataDict objectForKey:someKey])

потому что TouchJSON пропускает ключ из словаря, если для nullObject установлено значение nil (или NULL). Если ключ отсутствует в словаре, NSDictionary возвращает nil, что равно нулю, поэтому условие if работает так, как вы ожидаете.

Если вы не укажете nullObject как nil, вы можете вместо этого проверить на нулевое значение следующим образом:

if ([jsonDataDict objectForKey:someKey] == [NSNull null])
0 голосов
/ 13 апреля 2017

Есть библиотеки, которые занимаются этим. Один из них - SwiftyJSON в Swift , другой - NSTEasyJSON в Objective-C . С этой библиотекой (NSTEasyJSON) будет легко справляться с такими проблемами. В вашем случае вы можете просто проверить нужные значения:

NSTEasyJSON *JSON = [NSTEasyJSON withData:JSONData];
NSString *someValue = JSON[someKey].string;

Это значение будет NSString или nil, и вы не должны проверять его на NSNull, NULL самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...