2011-04-19 76 views
16

嗨 我正在使用TouchJSON反序列化一些JSON。我过去一直在使用它,在那些我手动处理NSNull事件的场合。我认为作者也必须处理这个问题,所以我再这样做只会是开销。然后我在文档中找到了这个:TouchJSON,处理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]) 

没有提都在那里路过零被允许的,但传递NULL导致崩溃的情况。

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

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

+0

我在下面评论过,但为了这个问题的后代,NSDictionary *不能包含零作为键或值。来自Cocoa文档:“键或值都不可以为零;如果您需要在字典中表示空值,则应该使用NSNull。” – Erik 2012-08-10 03:51:55

回答

15

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

现在,当你这样做,你的第二个谓语实际工作正常:

if (![jsonDataDict objectForKey:someKey]) 

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

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

if ([jsonDataDict objectForKey:someKey] == [NSNull null]) 
+0

谢谢,这完美的答案,只要我能始终如一地期待一个无价值的回报,我会没事的。 – RickiG 2011-04-19 18:13:12

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]值等。

+0

谢谢沃尔夫冈。如果您选择的JSON库不提供“nullObject”,我可以看到该类别的需要。这是一个处理NSNull每一次你必须访问你的+15属性模型实体的一塌糊涂:) – RickiG 2011-04-19 18:15:38

+0

这是一个很好的方式来做到这一点(事实上,我怎么在我自己的应用程序中做到这一点)。这样做的好处是,你仍然可以检查一个关键字是否存在于一个空值的字典中;将TouchJSON的'nullObject'设置为nil,则无法区分空值和缺少的键。 – 2011-04-19 19:26:26

+1

很好的答案,谢谢! – 2013-05-21 11:35:25

0

有些库处理它。其中之一是SwiftyJSONSwift,另一个是NSTEasyJSONObjective-C。 有了这个库(NSTEasyJSON),将很容易处理这些问题。你的情况,你可以只检查值,您需要:

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

此值将NSStringnil,你不应该检查它的NSNull,NULL自己。