我从Web服务器读取json后得到一个字典数组,并使用以下内容确保在获取其int值之前在数组的第一个字典中得到一个特定的键:
if([jsonObject[0] objectForKey:@"votes"]!= nil)
{
int votes = [[jsonObject[0] objectForKey:@"votes"] intValue];
[[UserObject userUnique] updateVotes:votes];
}
然而,我的应用程序仍偶尔崩溃,说我在Null上调用了intValue。我还尝试将控制语句结构化为
if([jsonObject[0] objectForKey:@"votes"])
但这也会导致同样的错误/应用程序崩溃。我的语法似乎与SO(Check if key exists in NSDictionary is null or not)上的已接受答案一致。关于应用intvalue的任何其他/我应该检查键值对的存在的任何建议?
感谢您的任何建议。
答案 0 :(得分:0)
在您的代码中连续。不要运行方法。最好在使用json时添加更多的null和type检查。我们这样做:
if (jsonObject && [jsonObject isKindOfClass:[NSArray class]])
{
NSArray *jsonArray=(NSArray *)jsonObject;
if (jsonArray.count>0)
{
id firstObject=jsonArray[0];
if ([firstObject isKindOfClass:[NSDictionary class]])
{
NSDictionary *jsonDict=(NSDictionary *)firstObject;
id votesNumber=jsonDict[@"votes"];
if (votesNumber && [votesNumber isKindOfClass:[NSNumber class]])
{
int votes=[votesNumber intValue];
[[UserObject userUnique] updateVotes:votes];
}
}
}
}
现在代码更安全了。它还会崩溃吗?
答案 1 :(得分:0)
nil
和null
之间存在差异。 nil
不是对象:它是一个特殊的指针值。 null
(由[NSNull null]
重新调整)是一个对象:它是必需的,因为它可以存储在NSDictionary
等容器中。
NSString *votesString = [jsonObject[0] objectForKey:@"votes"];
if (votesString != nil && votesString != [NSNull null])
{
int votes = [votesString intValue];
[[UserObject userUnique] updateVotes:votes];
}
编辑: @SunnysideProductions问题的答案
您提到的帖子建议您通过创建null
方法将nil
值转换为-safeObjectForKey:
值。您没有使用-safeObjectForKey:
,而是使用默认的-objectForKey:
方法。
答案 2 :(得分:0)
当您在可为空的字典中调用objectForKey
时,应用崩溃了,因此我通过以下方式解决了此问题。
- (instancetype)initWithDictionary:(NSDictionary*)dictionary {
id object = dictionary;
if (dictionary && (object != [NSNull null])) {
self.name = [dictionary objectForKey:@"name"];
self.age = [dictionary objectForKey:@"age"];
}
return self;
}