在 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 键的主要内容,如果未能解决你的问题,请参考以下文章

如何检查Objective C BOOL变量的真假[关闭]

如何在 ios Objective c 中检查推送通知是不是在后台模式下接收?

在 Objective C 中检查 NSString 的 NOT <null> 值的条件

如何检查Objective c中是不是没有服务器响应

在objective-c中检查文件扩展名

如何在基于块的 API 方法中使用非空和可为空的 Objective-C 关键字