您好,我正在使用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时,它将插入传递给它的值(空)。所以稍后当我使用这些值时,我不会得到NSNull,而是NULL。
这似乎很奇怪,返回值是一个只能包含对象的NSDictionary,不是应该将值默认为'nil‘吗?
如果为NULL,我可以像这样检查这些值吗?
if([jsonDataDict objectForKey:someKey] == NULL)
似乎更符合逻辑的是能够做到这一点:
if(![jsonDataDict objectForKey:someKey])
更不用说允许传递nil但传递NULL会导致崩溃的所有情况。
或者我可以只将'nil‘传递给反序列化程序吗?
这在很大程度上源于我仍然在为nil,NULL,NSNULL null而苦苦挣扎,也许我没有看到使用nil的潜在警告。
发布于 2011-04-20 00:02:30
nil
和NULL
实际上都等于零,所以在实践中它们是可以互换的。但是您说得对,为了保持一致性,TouchJSON的文档应该使用theDeserializer.nullObject = nil
而不是NULL
。
现在,当您这样做时,您的第二个谓词实际上工作得很好:
if (![jsonDataDict objectForKey:someKey])
因为当您将TouchJSON设置为nil
(或NULL
)时,nullObject
将省略字典中的键。当字典中不存在该键时,NSDictionary返回nil,nil为零,因此if条件按预期工作。
如果不将nullObject
指定为nil
,则可以像这样检查null:
if ([jsonDataDict objectForKey:someKey] == [NSNull null])
发布于 2011-04-20 00:14:07
对于另一个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、空值等问题。
发布于 2017-04-13 23:24:28
有一些库可以处理它。其中一个是Swift中的SwiftyJSON,另一个是Objective-C中的NSTEasyJSON。有了这个库(NSTEasyJSON),就可以很容易地处理这些问题。在您的情况下,您可以只检查您需要的值:
NSTEasyJSON *JSON = [NSTEasyJSON withData:JSONData];
NSString *someValue = JSON[someKey].string;
这个值将是NSString
或nil
,您不应该检查它是否为NSNull,否则您自己为空。
https://stackoverflow.com/questions/5716942
复制相似问题