检查Objective C中的空JSON密钥

时间:2014-03-26 04:54:27

标签: ios objective-c json parsing

我正在开发一个App,它返回用户在tableView中搜索的一些JSON数据。有时会返回一个空键,如果选择选择,它似乎会崩溃我的应用程序。我已经查找了其他解决方案,但无论我如何设置“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");
}

有人可以告诉我为什么这些导致我的应用程序继续崩溃?如果我需要更多信息,请告诉我。

2 个答案:

答案 0 :(得分:4)

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 = @"";
    }

如果您需要更多信息,请与我们联系。

答案 1 :(得分:1)

由于下面一行

,它第二次崩溃
NSURL *coverImage = [NSURL URLWithString:[gameDetails objectForKey:@"box_front"]];

if ([gameDetails objectForKey:@"box_front"] != nil)

你的if条件总是不是假的,有时你得到一些其他的值,如(null)NSNull,这与nil不同,NSURL语句会崩溃如果您提供的不是NSString

为了避免这种情况,您可以检查[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)

我希望它有效。

干杯。