TouchJSON,处理NSNull

时间:2011-04-19 13:16:16

标签: objective-c null touchjson

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

这看起来很奇怪,返回值是一个只能包含Objects的NSDictionary,不应该将值默认为'nil'吗?

如果是NULL,我可以检查这样的值吗?

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

能够做到这一点似乎更合乎逻辑:

if(![jsonDataDict objectForKey:someKey])

不要说所有允许传递nil的情况,但传递NULL会导致崩溃。

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

这很大程度上源于我仍在努力与nil,NULL,[NSNULL null],也许我没有看到使用nil的潜在警告。

3 个答案:

答案 0 :(得分: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]值等。

答案 1 :(得分:15)

nilNULL实际上都等于零,因此它们在实践中可以互换。但是你是对的,为了保持一致性,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])

答案 2 :(得分:0)

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

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

此值为NSStringnil,您不应自行检查NSNull,NULL。