16

您好我正在使用 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 的潜在警告。

4

3 回答 3

48

对于另一个 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] 值等。

于 2011-04-19T16:14:07.410 回答
15

nil并且NULL实际上都等于零,因此在实践中它们是可以互换的。但是你是对的,为了保持一致性,TouchJSON 的文档应该使用theDeserializer.nullObject = nil而不是NULL.

现在,当您这样做时,您的第二个谓词实际上可以正常工作:

if (![jsonDataDict objectForKey:someKey])

nullObject因为当您设置为nil(或NULL)时,TouchJSON 会省略字典中的键。当字典中不存在该键时,NSDictionary 返回 nil,它为零,因此您的 if 条件按预期工作。

如果您不指定nullObjectas nil,则可以改为检查 null ,如下所示:

if ([jsonDataDict objectForKey:someKey] == [NSNull null])
于 2011-04-19T16:02:30.367 回答
0

有处理它的图书馆。其中一个是Swift中的SwiftyJSON,另一个是Objective -C中的NSTEasyJSON。使用这个库 (NSTEasyJSON) 将很容易处理这些问题。在您的情况下,您可以检查您需要的值:

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

这个值将是NSStringornil并且你不应该自己检查它的 NSNull, NULL。

于 2017-04-13T15:24:27.560 回答