【问题标题】:Crash on accessing a key that should be in an NSDictionary created from JSON [closed]访问应该在从 JSON 创建的 NSDictionary 中的密钥时崩溃 [关闭]
【发布时间】:2014-04-11 17:43:26
【问题描述】:

我有一个dictionary,它有时会从一些 JSON 数据中读取空值。当我这样做时:

 NSDictionary *caption=[image objectForKey:@"caption"]; //crash here!

caption 字段在那里但为空,(在 JSON 中,caption:null),我遇到了崩溃。 我怎样才能消除这种情况?

我可以稍后通过以下方式检查 null:

 NSDictionary *caption=[image objectForKey:@"caption"];
 NSString *text=@"";
 if( caption!=NULL  )
 {text=[caption objectForKey:@"text"];  }

但崩溃发生在此之前。

这就是我的字典的构建方式:

 NSError *error = nil;
 NSDictionary *result = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
 NSArray *myResults=[result objectForKey:@"data"];
 long count=[myResults count];

 for(NSDictionary *image in myResults)
 {
       NSDictionary *links=[image objectForKey:@"images"];
       NSDictionary *standard=[links objectForKey:@"standard"];
       NSString *url=[standard objectForKey:@"url"];

       NSLog(@"image:%@",image);
       NSDictionary *caption=[image objectForKey:@"caption"]; //CRASH

【问题讨论】:

  • 你不能在 NSDictionary 中有一个实际的 null/nil,除非字典以某种方式损坏。您确定崩溃来自该特定声明吗?发生了什么异常?
  • 贴出真正导致崩溃的代码。还包括完整的错误消息。
  • 请注意,您可以在 NSDictionary 中有一个 NSNull 对象,这样 NSLog 就会像“(NULL)”一样(我忘记了确切的消息)。 NSNull 对象不会是 == null/nil,如果在下一条语句中盲目使用,将导致“无效选择器”异常。然而,NSNull 对象比较== [NSNull null],因此您可以使用它来检查它。
  • 我再说一遍,你不能创建一个包含nil 值的NSDictionary。向我们展示您的字典转储。 (并向我们展示创建它的 JSON。)
  • 仅供参考 - 否决票是因为您的问题没有提供足够的细节来帮助回答它。在您指出导致崩溃的实际代码行和崩溃的错误消息之前,您的问题确实无法回答 - 因此投反对票。您的最新更新仍未提供此信息。

标签: objective-c json cocoa crash nsdictionary


【解决方案1】:

你确定 NSDictionary *caption=[image objectForKey:@"caption"];会返回字典吗?

不管怎样,检查它是否为 JSON null 的方法是:

if ([image[@"caption"] isEqual:[NSNull null]]) { // it's null }

请注意,字典和数组不能包含 nil。 nil 不是对象值。 [NSNull null]是一个特殊的对象,相当于nil,可以在nil不能用的地方使用。

https://developer.apple.com/library/mac/documentation/cocoa/reference/foundation/classes/NSNull_Class/Reference/Reference.html

【讨论】:

  • 不需要使用isEqual——因为NSNull是一个单例类,你可以简单地使用==
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-30
  • 1970-01-01
相关资源
最近更新 更多