JSON返回null ios时Tableview崩溃

Posted

技术标签:

【中文标题】JSON返回null ios时Tableview崩溃【英文标题】:Tableview crashing when JSON returns null ios 【发布时间】:2016-04-11 13:40:20 【问题描述】:

我正在使用 google places api 来搜索附近的餐馆。每个餐厅都显示在 UITableView 的一个单元格中。返回响应采用 JSON 格式。 JSON 包含的内容中有一个十进制数字,表示餐厅的评级。我想在单元格中显示评分。但是,有时餐厅没有评级,值为 (null)。所以我在 cellForRowAtIndexPath 方法中添加了一个检查,检查 rating 的值是否为 null。

if([dict valueForKey:kResponseRating] != [NSNull null])

    NSNumber *rating = [dict valueForKey:kResponseRating];
    [cell displayRating:rating];

else

    NSLog(@"Value of rating is null");

当我运行应用程序时,tableView 仍然会在返回空值时立即崩溃,并且不会打印字符串“评级值为空”。因此,即使 json 中的值为 null,它也不会进入 else 语句。

好的,所以我检查了返回值是否为 NSString 类类型,而它不是。这是我用同样的方法做的:

if([[dict objectForKey:kResponseRating] isKindOfClass:[NSString class]])

    NSLog(@"The return response is of type NSString");

而且它没有进入 if 语句。

这是计算评级并发布它的方法。该方法将评级四舍五入到最接近的 0.5,然后将其显示为 5 颗星。

-(void)displayRating:(NSNumber*)rating

double rate = [rating doubleValue];


rate = round(rate * 2.0) / 2.0;


int counter = 0;
double compareVar = 1.0;

while(counter <= 4)

  if(rate == 0.0)
  
      imgRating[counter] = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"starempty.png"]];
      [self.contentView addSubview:imgRating[counter]];
  
  else
  

    if(compareVar < rate)
    
        imgRating[counter] = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"starfill.png"]];
        [self.contentView addSubview:imgRating[counter]];
    
    else if(compareVar == rate)
    
        imgRating[counter] = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"starfill.png"]];
        [self.contentView addSubview:imgRating[counter]];
    
    else
    
        if(compareVar - rate == 0.5)
        
            imgRating[counter] = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"starhalffill.png"]];
            [self.contentView addSubview:imgRating[counter]];
        
        else
        
            imgRating[counter] = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"starempty.png"]];
            [self.contentView addSubview:imgRating[counter]];
        

   

    counter++;
    compareVar = compareVar + 1.0;

  


   NSLog(@"This is rate: %f", rate);

此方法中的一行代码是否导致崩溃?

【问题讨论】:

如果其他条件有效?我的意思是检查 NSNull 是否有效? 我不这么认为。即使值为空,它也总是进入 if 语句。还有一件事,json 返回一个带有括号的空值,例如 (null)。 显示完整的崩溃日志并停止使用valueForKey: 使用objectForKey从字典中获取信息 你把这段代码放在哪里了?崩溃的原因是什么? 【参考方案1】:

试试下面的检查

if(![dict objectForKey:kResponseRating] || [dict objectForKey:kResponseRating] == [NSNull null])  
    NSLog(@"Either the key doesn't exist or the value is null"); 

else 
    // Covert and set the rating here!

【讨论】:

字典中的条目极不可能等于 [NSNull 类]。它可能等于 [NSNull null],但不等于 [NSNull 类]。而对于 [NSNull null] 您不需要与 isEqual: 进行比较,只需使用 ==。这很可能有效,因为密钥实际上没有任何价值。代码无法识别 JSON 文档中的 null。 @gnasher729 这是复制粘贴错误之一。感谢您指出这一点。 完全没有必要,只需使用isKindOfClass: 验证而不是isEqual[NSNull Class]【参考方案2】:

应该这样做。

if ([[dictionary valueForKey:@"key"] isKindOfClass:[NSNull class]] || ![dict valueForKey:@"key"])
   // Key doesn't exist or equals <null>

else
// Key exist

而且我很确定这个问题有很多关于堆栈溢出的答案。在创建新问题之前,您应该尝试查看您的问题是否有答案。

无论如何,我希望这会有所帮助

【讨论】:

如果字典中不存在“key”,此代码将执行 else 块。试试这个场景,"key1": "value 1",你正在搜索“key”,它会说 value 不是 null,这是不正确的。 如果字典中不存在该键,它将返回 null -> 即[NSNull Class]。继续尝试吧......在否决投票之前,您应该首先验证它是否有效,因为显然您不知道自己在说什么。 调试这段代码: NSDictionary *dict = @@"key1" : @"value 1"; if ([[dict valueForKey:@"key1"] isKindOfClass:[NSNull class]]) //表示字典里面的值是 NSLog(@"KEY EXIST"); else // 值不是 NSLog(@"DO NOT EXIST"); 之后,删除不赞成票。 你误会了,试试调试这段代码:NSDictionary *dictionary = @@"key1": @"Value 1"; if ([[dictionary objectForKey:@"key"] isKindOfClass:[NSNull class]]) NSLog(@"This is null"); else NSLog(@"This is not null"); 。然后告诉我解决方案是否有效。 我复制/粘贴了输入 else 的第二个选项 (key1),请继续运行您刚刚发送的相同代码。我在几分钟前(再次)测试了它并且它有效。让我知道进展如何,并记得在之后删除反对票

以上是关于JSON返回null ios时Tableview崩溃的主要内容,如果未能解决你的问题,请参考以下文章

TableView 数组返回 null

IOS swift如何使用返回的Json数据填充我的TableView

UITableView 的 ReloadData 不起作用;登录时 tableView 返回 NULL

JSON 解析返回 null 到 iOS(json 字符串看起来正确)

json_decode 从 iOS 应用程序返回空值

iOS 自定义 TableViewCell 类子视图返回 null