首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >TouchJSON,处理NSNull

TouchJSON,处理NSNull
EN

Stack Overflow用户
提问于 2011-04-19 21:16:16
回答 3查看 13K关注 0票数 16

您好,我正在使用TouchJSON来反序列化一些JSON。我过去一直在使用它,在这些情况下,我手动处理了NSNull的出现。我认为作者也必须处理这个问题,所以我再做一次只会增加开销。然后,我在文档中找到了以下内容:

避免输出中的NSNull值。

代码语言:javascript
复制
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,我可以像这样检查这些值吗?

代码语言:javascript
复制
if([jsonDataDict objectForKey:someKey] == NULL)

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

代码语言:javascript
复制
if(![jsonDataDict objectForKey:someKey])

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

或者我可以只将'nil‘传递给反序列化程序吗?

这在很大程度上源于我仍然在为nil,NULL,NSNULL null而苦苦挣扎,也许我没有看到使用nil的潜在警告。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-20 00:02:30

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

现在,当您这样做时,您的第二个谓词实际上工作得很好:

代码语言:javascript
复制
if (![jsonDataDict objectForKey:someKey])

因为当您将TouchJSON设置为nil (或NULL)时,nullObject将省略字典中的键。当字典中不存在该键时,NSDictionary返回nil,nil为零,因此if条件按预期工作。

如果不将nullObject指定为nil,则可以像这样检查null:

代码语言:javascript
复制
if ([jsonDataDict objectForKey:someKey] == [NSNull null])
票数 15
EN

Stack Overflow用户

发布于 2011-04-20 00:14:07

对于另一个JSON库,但有相同的问题,我在NSDictionary上创建了以下类别:

代码语言:javascript
复制
@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数据时,我都会像这样检索值:

代码语言:javascript
复制
NSString *someString = [jsonDictionary objectForKeyNotNull:@"SomeString"];

通过这种方式,我的项目中的代码变得更加整洁,同时我不必考虑处理NSNull、空值等问题。

票数 48
EN

Stack Overflow用户

发布于 2017-04-13 23:24:28

有一些库可以处理它。其中一个是Swift中的SwiftyJSON,另一个是Objective-C中的NSTEasyJSON。有了这个库(NSTEasyJSON),就可以很容易地处理这些问题。在您的情况下,您可以只检查您需要的值:

代码语言:javascript
复制
NSTEasyJSON *JSON = [NSTEasyJSON withData:JSONData];
NSString *someValue = JSON[someKey].string;

这个值将是NSStringnil,您不应该检查它是否为NSNull,否则您自己为空。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5716942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档