10

我想从 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 长度]:无法识别的选择器发送到实例

我怎么解决这个问题 ?

4

4 回答 4

41

在从 JSON 访问值之前进行检查,例如,

if([NSNull null] != [listDic objectForKey:@"voteCount"]) {
    NSString *voteCount = [listDic objectForKey:@"voteCount"];
    /// .... 
}

检查的原因是,像NSDictionary这样的集合对象不允许值为nil,因此它们被存储为 null。传递intValue给 aNSNull将不起作用,因为它无法识别此选择器。

希望有帮助!

于 2013-09-19T06:41:47.297 回答
6

正如其他人所说,JSON null 将被反序列化为NSNull. 与 不同nil,您不能向 发送(大多数)消息NSNull

一种解决方案是通过类别在 NSNull 上添加 -intValue 的实现:

@implementation NSNull (IntValue)
-(int)intValue { return 0 ; }
@end

现在您的代码将工作,因为发送-intValueNSNull现在将返回0

另一种选择:您还可以将“IfNullThenNil”类别添加到 NSObject...

@implementation NSObject (IfNullThenNil)
-(id)ifNullThenNil { return self ; }
@end

@implementation NSNull (IfNullThenNil)
-(id)ifNullThenNil { return nil ; }
@end

现在,您的代码变为:

int voteCount = [[[listDic objectForKey:@"voteCount"] ifNullThenNil] intValue] ;

只需将调用添加到-ifNullThenNil您从 JSON 对象访问值的任何位置。

于 2014-02-24T08:36:25.270 回答
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"]];

    }
}

我希望它对某人有所帮助。如果您需要任何帮助,请告诉我。

于 2015-06-30T13:18:31.137 回答
0

这很正常。JSON 可以向您的应用发送空值。如果是这样,那么这是服务器有意完成的,它希望您处理它。找出收到空值时的正确行为。然后当你得到一个可能是空值的对象时,检查

if (object == [NSNull null])
{
    // stuff to handle null objects
}
else
{
    // stuff to handle non-null objects
}

真正的问题不是您的应用程序崩溃,而是您的应用程序没有处理它应该处理的 JSON 数据。

于 2014-02-24T08:23:15.850 回答