TouchJSON如何处理NSNull?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (18)

我正在使用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会导致崩溃。

或者我可以将'零'传递给解串器吗?

这大部分来自我仍然努力与NULL,NULL,[NSNULL null],也许我没有看到使用零的潜在警告。

提问于
用户回答回答于

nilNULL实际上都等于零,所以他们在实践中,可以互换。但是你是对的,为了保持一致性,TouchJSON的文档应该用来theDeserializer.nullObject = nil代替NULL

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

if (![jsonDataDict objectForKey:someKey])

因为TouchJSON在nullObject设置为nil(或NULL)时省略了字典中的键。当字典中不存在密钥时,NSDictionary返回nil,它是零,所以你的if条件如你所期望的那样工作。

如果你不指定nullObjectnil,你可以改为像这样检查null:

if ([jsonDataDict objectForKey:someKey] == [NSNull null])
用户回答回答于

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

扫码关注云+社区