检查JSON值是否存在 - iOS

时间:2014-02-27 16:38:56

标签: ios objective-c json uitableview try-catch

我有一个iOS应用程序,可以下载并解析Twitter JSON提要,然后在UITableView中显示该提要。这一切都很好,但我有一个问题:

当用户点击UITableView单元格时,应用程序会查看数组“tweets_links”并查看该特定推文是否有附加网址,如果有,则会显示网页视图。

因为并非所有的推文都有网站网址,所以我添加了一个简单的try catch语句(比如在C ++中),它可以告诉我在尝试访问数组的这一部分时是否存在异常。

我的问题是:这是做坏的好方法吗?

这是我的代码:

int storyIndex = indexPath.row;
int url_test = 1;
NSString *url;

@try {
    url = [[tweets_links[storyIndex] valueForKey:@"url"] objectAtIndex:0];
}

@catch (NSException *problem) {
    // There is NO URL to access for this Tweet. Therefore we get the out of bounds error.
    // We will NOT take the user to the web browser page.
    // Uncomment the line below if you wish to see the out of bounds exception.
    // NSLog(@"%@", problem);
    url_test = 0;
}

if (url_test == 1) {
    WebBrowser *screen = [[WebBrowser alloc] initWithNibName:nil bundle:nil];
    self.seconddata = screen;
    seconddata.web_url = url;
    screen.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
    [self presentViewController:screen animated:YES completion:nil];
}

else if (url_test == 0) {
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Info" message:@"There is no URL attatched to this Tweet." delegate:self cancelButtonTitle:@"Dismiss" otherButtonTitles:nil];
    [alertView show];

    [tweetTableView deselectRowAtIndexPath:indexPath animated:YES];
}

有没有更好的方法来尝试实现我正在做的事情?

谢谢,Dan。

5 个答案:

答案 0 :(得分:5)

使用try和catch是不鼓励Objective-C有其他方法检查和处理错误

// firstObject will return the first object in the array or nil if the array is empty.
url = [[tweets_links[storyIndex][@"url"]] firstObject];

if (!url) {
    // handle the case for no url
} else {
    // do something with url
}

由于在Objective-C中向nil发送消息是安全的并且返回nil,因此链接调用是安全的。例如如果字典没有该键的对象,则它将返回nil并将firstObject发送到nil返回nil

答案 1 :(得分:1)

如果以下方法可以正常使用,因为TRY CATCH用于捕获编程错误 并使用 的 objectForKey:  代替 的 valueForKey

if ([tweets_links[storyIndex] objectForKey:@"url"] != nil)

OR

if ([url isKindOfClass:[NSString class]])
{
// Code handling the URL
}
else
{
// Code handling there is no URL
}

答案 2 :(得分:0)

我对Twitter提要不是很了解,但您可以查看nil返回的objectForKey:值,如此

if ([tweets_links[storyIndex] objectForKey:@"url"] != nil) { /* process the URL */ }

您的代码假设该值始终是至少size = 1的数组,在假设它是一个数组之前检查@“url”键的值会更安全。

答案 3 :(得分:0)

使用Objective-C中的异常。例外保留用于编程错误。您没有捕获它们,您修复了代码。使用JSON文档,您永远不会保证收到的内容,所以请小心。

NSString* url = nil;
NSArray* linksArray = nil;
NSDictionary* linkDict = nil;
NSArray* urlArray = nil;

if ([tweet_links isKindOfClass:[NSArray class]])
    linksArray = tweet_links;

if (storyIndex >= 0 && storyIndex < linksArray.count)
    linkDict = linksArray [storyIndex];

urlArray = linkDict [@"url"];
if ([urlArray isKindOfClass:[NSArray class]] && urlArray.count > 0)
    url = urlArray [0];

if ([url isKindOfClass:[NSString class]])
{
    // Code handling the URL
}
else
{
    // Code handling there is no URL
}

请注意,将消息发送到nil对象始终会返回0 / NO / nil。

请养成正确命名变量的习惯。你写了“int url_test = 1;”。 url_test是什么意思?我读了变量名,我不知道它的含义。我需要了解所有代码。使它成为“int”意味着它可能是0,1,2,20000或其他什么。如果你改写“BOOL urlValid = YES;”很明显:这意味着你有一个有效的URL。

答案 4 :(得分:0)

由于url值是一个NSString值,你可以使用length检查它是否为零,如果没有,是否有任何值(非空字符串)。您可以检查此NSString是否是有效的URL。

  - (BOOL) validateUrl: (NSString *) candidate {
        NSString *urlRegEx = @"(http|https)://((\\w)*|([0-9]*)|([-|_])*)+([\\.|/]((\\w)*|([0-9]*)|([-|_])*))+";
        NSPredicate *urlTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", urlRegEx]; 
        return [urlTest evaluateWithObject:candidate];
    }

...

NSString *url = [[tweets_links[storyIndex][@"url"]] firstObject];

if ([url length] && [self validateUrl: url]) {
 // Has a valid URL
}