我想从JSON服务获取数据。从JSON值获取数据时,只有iOS 7版本崩溃。 它从下面的JSON服务返回:
{
voteAverageRating = 0;
voteCount = 0;
}
我的代码
int voteCount = [listDic objectForKey:@"voteCount"] intValue] ;
_LB_voteNumber.text = [NSString stringWithFormat:@"(%i)",voteCount];
它适用于iOS 5,5.1,6.0,6.1但它只崩溃了iOS7版本。它给出了这个错误:
0x00098117 _mh_execute_header [NSNull intValue]:无法识别的选择器 发送到实例
然后我改变了我的代码;
NSString *voteCount = [listDic objectForKey:@"voteCount"] ;
_LB_voteNumber.text = [NSString stringWithFormat:@"(%@)",voteCount];
运行此代码时。它再次崩溃只有iOS 7版本。它给出了这个错误:
0x00098117 _mh_execute_header [NSNull length]:无法识别的选择器 发送到实例
我该如何解决这个问题?
答案 0 :(得分:39)
在从JSON访问值之前进行检查,例如
if([NSNull null] != [listDic objectForKey:@"voteCount"]) {
NSString *voteCount = [listDic objectForKey:@"voteCount"];
/// ....
}
检查的原因是,NSDictionary
等集合对象不允许值为nil
,因此它们存储为null。将intValue
传递给NSNull
将无效,因为它无法识别此选择器。
希望有所帮助!
答案 1 :(得分:6)
正如其他人所说,JSON null将被反序列化为NSNull
。与nil
不同,您无法向NSNull
发送(大多数)消息。
一种解决方案是通过类别在NSNull上添加-intValue的实现:
@implementation NSNull (IntValue)
-(int)intValue { return 0 ; }
@end
现在您的代码将有效,因为将-intValue
发送到NSNull
现在将返回0
另一种选择:您还可以向NSObject添加“IfNullThenNil”类别......
@implementation NSObject (IfNullThenNil)
-(id)ifNullThenNil { return self ; }
@end
@implementation NSNull (IfNullThenNil)
-(id)ifNullThenNil { return nil ; }
@end
现在,您的代码变为:
int voteCount = [[[listDic objectForKey:@"voteCount"] ifNullThenNil] intValue] ;
只需在您从JSON对象访问值的任何位置添加对-ifNullThenNil
的调用。
答案 2 :(得分:1)
对我而言,这是有效的
NSArray* merStore = [tmpDictn objectForKey:@"merchantStore"];
if ([merStore isKindOfClass:[NSArray class]] && merStore.count !=0)
{
for(int n = 0; n < merStore.count; n++)
{
NSMutableDictionary *storeDic = [merStore objectAtIndex:n];
[latitudeArray addObject:[storeDic objectForKey:@"latitude"]];
}
}
我希望它有所帮助。如果您需要任何帮助,请告诉我。
答案 3 :(得分:0)
这很正常。 JSON可以向您的应用发送空值。如果是这样,那么这是由服务器故意完成的,它希望你处理它。找出收到空值时的正确行为。然后,当您获得可能为空值的对象时,请检查
if (object == [NSNull null])
{
// stuff to handle null objects
}
else
{
// stuff to handle non-null objects
}
真正的问题不是您的应用程序崩溃,而是您的应用程序无法处理它应该处理的JSON数据。