在 NSDictionary 中查询 if/else 语句中的值

Posted

技术标签:

【中文标题】在 NSDictionary 中查询 if/else 语句中的值【英文标题】:Querying an NSDictionary for values in an if/else statement 【发布时间】:2014-05-01 19:52:16 【问题描述】:

我的解析云代码函数设置为以 JSON 形式返回数据,如下所示:

response.success
(
                "results": [
                   "Number of top categories": top2.length ,
                             "Top categories": top2 ,  
                          "Number of matches": userCategoriesMatchingTop2.length , 
          "User categories that match search": userCategoriesMatchingTop2 
                ]
);

我想做的是在我的 Objective-C 代码中查询这个 JSON 数组,并通过使用底部的 if 语句根据返回的内容执行某些操作。例如,它说:

if ([result intValue] == 1)
                                                    [self performSegueWithIdentifier:@"ShowMatchCenterSegue" sender:self];
                                                

我想用一条语句替换result intValue,说明 JSON 数据中“匹配数”的值等于 1。

- (IBAction)nextButton:(id)sender

    if (self.itemSearch.text.length > 0) 
        [PFCloud callFunctionInBackground:@"eBayCategorySearch"
                           withParameters:@@"item": self.itemSearch.text
                                    block:^(NSString *result, NSError *error) 
                                        NSLog(@"'%@'", result);

                                        NSData *returnedJSONData = result;

                                            NSError *jsonerror = nil;

                                            NSDictionary *categoryData = [NSJSONSerialization
                                                                     JSONObjectWithData:returnedJSONData
                                                                     options:0
                                                                     error:&jsonerror];

                                            if(error)  NSLog(@"JSON was malformed."); 

                                            // validation that it's a dictionary:
                                            if([categoryData isKindOfClass:[NSDictionary class]])
                                            
                                                NSDictionary *jsonresults = categoryData;
                                                /* proceed with jsonresults */
                                            
                                            else
                                            
                                                NSLog(@"JSON dictionary wasn't returned.");
                                            



                                        if (!error) 

                                            // if 1 match found clear categoryResults and top2 array
                                            if ([result intValue] == 1)
                                                [self performSegueWithIdentifier:@"ShowMatchCenterSegue" sender:self];
                                            

                                            // if 2 matches found
                                            else if ([result intValue] == 2)
                                                [self performSegueWithIdentifier:@"ShowUserCategoryChooserSegue" sender:self];
                                                //default to selected categories criteria  -> send to matchcenter -> clear categoryResults and top2 array
                                            

                                            // if no matches found, and 1 top category is returned
                                            else if ([result intValue] == 2) 
                                                [self performSegueWithIdentifier:@"ShowCriteriaSegue" sender:self];
                                            
                                            // if no matches are found, and 2 top categories are returned
                                            else if ([result intValue] == 2) 
                                                [self performSegueWithIdentifier:@"ShowSearchCategoryChooserSegue" sender:self];
                                            

                                        
                                    ];
    

【问题讨论】:

使用间接返回NSError的方法时,Cocoa要求在使用NSError之前检查直接返回值,而不是错误是否为nil。如果方法指示失败,错误是 guaranteed 是有效的,但相反的 - 它将是 nil 成功 - not 保证,即使你将它设置为 @987654330事先@。 您遇到了什么问题?您需要知道结果字典中有多少项?完全不清楚您所说的“匹配数”是什么意思。 如果你看一下我返回的 JSON,"Number of matches" 是其中一个键,它的值是从我的云代码中的 userCategoriesMatchingTop2 数组的长度得出的。在这种情况下,如果userCategoriesMatchingTop2.length 等于 1,我想告诉我的 ios 应用执行某个操作。 实现这一目标您面临的困难是什么? 我不确定如何形成执行此操作所需的语法。我查看了 NSDictionary 文档,但不清楚我将如何处理这种特殊情况。 【参考方案1】:

据我了解,您获得的响应 JSON 数据是字典中的字典数组。

要检索这些值中的每一个,您可以使用以下步骤:

第 1 步:

将字典数组从结果字典中分离成一个NSArray 对象。

NSArray *resultArray = [resultDictionary objectForKey:@"results"];

第 2 步:

现在您有了resultArray,您可以提取所需的值,如下所示: 假设你想要NSNumber对象"Number of matches"的值, 你知道它是resultArray中的3rd对象,所以它的索引是2

NSDictionary *dictionary = [resultArray objectAtIndex:2];
NSNumber *numberOfMatches = [dictionary objectForKey:@"Number of matches"];

现在您可以在任何地方使用[numberOfMatches intValue]

希望这会有所帮助! :)

【讨论】:

这绝对是正确且有意义的。但是,当我像这样设置代码并运行它时,应用程序崩溃并返回:codeshare.io/9lnvz 请将您用来分隔字典中数据的行移至if (!error) 块。 另外请使用异常断点来获取崩溃的确切位置。 从response data,我观察到"Top categories""User categories that match search" 是一个数字数组。所以你需要将这些字段的类型设置为NSArray,而不是NSNumber

以上是关于在 NSDictionary 中查询 if/else 语句中的值的主要内容,如果未能解决你的问题,请参考以下文章

ASIHttpRequest - 如何将参数的 NSDictionary 转换为 url 编码的查询参数字符串?

字典:NSDictionary的应用举例

NSDictionary 变成 1 NSMutableArray

如何使用包含Swift中相同键的多个值的查询参数构建URL?

NSPredicate 通过选择带有 Beginswith 的键来获取 NSDictionary 的值

第5课