在 Objective C 中检查一个空的 JSON 键
Posted
技术标签:
【中文标题】在 Objective C 中检查一个空的 JSON 键【英文标题】:Checking for an empty JSON Key in Objective C 【发布时间】:2014-03-26 04:54:26 【问题描述】:我正在开发一个应用程序,该应用程序返回用户在 tableView 中搜索的一些 JSON 数据。有时会返回一个空键,如果选择是 choosin,它似乎会使我的应用程序崩溃。我查找了其他解决方案,但无论我如何设置“if”检查,它仍然崩溃。
第一个很奇怪,它可以工作,但是在显示数据的文本视图中显示的是“”而不是“不可用...”为什么?
if ([gameDetails objectForKey:@"description"] !=nil)
gameDescription.text = [NSString stringWithFormat:@"%@", [gameDetails objectForKey:@"description"]];
else
gameDescription.text = [NSString stringWithFormat:@"Not Available..."];
无论我如何设置,下一个都会崩溃。
if ([gameDetails objectForKey:@"box_front"] != nil)
NSURL *coverImage = [NSURL URLWithString:[gameDetails objectForKey:@"box_front"]];
NSData *imageLink = [NSData dataWithContentsOfURL:coverImage];
coverArt.image = [UIImage imageWithData:imageLink];
else
NSLog(@"No Photo");
谁能告诉我为什么这些会导致我的应用程序不断崩溃?如果我需要更多信息,请告诉我。
【问题讨论】:
在第一种情况下,description
键的字典为空。在第二种情况下,您没有提及错误,但很可能您得到了一个 NSNull
对象。
可以在这里打印崩溃日志吗?
对于第 2 点第 1 点,您必须对 url 进行编码,然后从 URL 获取数据。并且您必须检查是否获取数据,然后仅在 imageview 中设置图像,例如 if(imageLink)coverArt.image = [UIImage imageWithData:imageLink];
Rmaddy:既然我得到了一个描述键的空字典,为什么要放 而不是我想要的文本?
因为NSDictionary description
在空字典上的输出将是
。顺便说一句 - 如果您想回复特定的人,请在他们的用户名前加上 @
符号。
【参考方案1】:
NSURL *coverImage = [NSURL URLWithString:[gameDetails objectForKey:@"box_front"]];
//你必须检查coverImage不是nil然后你只需要做以下操作。否则写一些关于 nil 的信息。
NSData *imageLink = [NSData dataWithContentsOfURL:coverImage];
coverArt.image = [UIImage imageWithData:imageLink];
// 要检查 nil 或 null,您可以使用以下代码。
if([[itemDataDict valueForKey:@"ItemNo"] isKindOfClass:[NSString class]])
if([[itemDataDict valueForKey:@"ItemNo"] isEqualToString:@""] || [[itemDataDict valueForKey:@"ItemNo"] isEqualToString:@"<null>"])
txtItemNo.text = @"";
else
txtItemNo.text = [NSString stringWithFormat:@"%@",[itemDataDict valueForKey:@"ItemNo"]];
else
txtItemNo.text = @"";
如果您需要更多信息,请告诉我。
【讨论】:
这个相同的解决方案可以应用于我的第一个问题吗?因为它返回一个空字典而不是 nil。 是的,您可以应用此解决方案来检查空字典,需要根据您的要求更改条件。【参考方案2】:由于下面的行,它第二次崩溃
NSURL *coverImage = [NSURL URLWithString:[gameDetails objectForKey:@"box_front"]];
和
if ([gameDetails objectForKey:@"box_front"] != nil)
您的 if 条件并不总是为假,有时您会得到一些其他值,例如 (null)
或 NSNull
,这与 nil
不同,如果您提供除 @987654327 以外的任何内容,NSURL
语句将崩溃@。
为避免这种情况,您可以在 [gameDetails objectForKey:@"box_front"]
上检查您所获得的内容。
我建议你可以使用下面的一些宏
#define IsEmpty(value) (value == (id)[NSNull null] || value == nil || ([value isKindOfClass:[NSString class]] && ([value isEqualToString:@""] || [value isEqualToString:@"<null>"]))) ? YES : NO
#define IfNULL(original, replacement) IsNULL(original) ? replacement : original
#define IsNULL(original) original == (id)[NSNull null]
#define SafeString(value) IfNULL(value, @"")
然后使用下面的检查
if (SafeString([gameDetails objectForKey:@"box_front"]).length != 0)
我希望它有效。
干杯。
【讨论】:
以上是关于在 Objective C 中检查一个空的 JSON 键的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ios Objective c 中检查推送通知是不是在后台模式下接收?