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]]) //表示字典里面的值是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崩溃的主要内容,如果未能解决你的问题,请参考以下文章
IOS swift如何使用返回的Json数据填充我的TableView
UITableView 的 ReloadData 不起作用;登录时 tableView 返回 NULL