TouchJSON,处理NSNull

| 你好 我正在使用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的潜在警告。
已邀请:
nil
和ѭ4actually实际上都等于零,因此在实践中它们是可互换的。但是您是对的,为了保持一致性,TouchJSON的文档应该使用
theDeserializer.nullObject = nil
而不是
NULL
。 现在,当您这样做时,您的第二个谓词实际上可以正常工作:
if (![jsonDataDict objectForKey:someKey])
因为当您将
nullObject
设置为
nil
(或
NULL
)时,TouchJSON会从字典中省略键。当字典中不存在该键时,NSDictionary返回nil,它为零,因此if条件可以按预期工作。 如果您未将
nullObject
指定为
nil
,则可以改为检查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]值等。
有处理它的库。其中之一是Swift中的SwiftyJSON,另一个是Objective-C中的NSTEasyJSON。 使用此库(NSTEasyJSON),可以轻松解决此类问题。就您而言,您可以只检查所需的值:
NSTEasyJSON *JSON = [NSTEasyJSON withData:JSONData];
NSString *someValue = JSON[someKey].string;
该值将是
NSString
nil
,并且您不应该自己检查NSNull和NULL。

要回复问题请先登录注册