您好 我正在使用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的潜在警告。
答案 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)
nil
和NULL
实际上都等于零,因此它们在实践中可以互换。但是你是对的,为了保持一致性,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;
此值为NSString
或nil
,您不应自行检查NSNull,NULL。