我有一个API返回一个JSON编码的数据字符串,返回一个实数或“null”作为值。只要JSON包含数字或字符串值,一切都按预期工作。如果key:value对值为null,则下面的代码崩溃。
当从SBJSON获取NULL时,如何正确测试NSDictionary objectForKey?
当API返回 null for filetype 时,下面的代码会在if()行崩溃。
我的Objective-C代码尝试测试预期值:
if (1 == [[task valueForKey:@"filetype"] integerValue]) {
// do something
} else {
// do something else
}
API JSON输出:
{"tclid":"3","filename":null,"filetype":null}
NSDictionary的NSLog()输出是:
task {
filename = "<null>";
filetype = "<null>";
tclid = 3;
}
答案 0 :(得分:5)
将数据从JSON传输到Cocoa集合时,NSNull
类用于表示“无值”,因为Cocoa集合不能有空插槽。 <null>
是NSNull
打印自己的方式。
要对此进行测试,您可以使用someObject == [NSNull null]
。它是一个单例 - 每个进程只有一个NSNull
实例 - 所以指针比较有效,尽管您可能更喜欢遵循通常的Cocoa比较约定并使用[someObject isKindOfClass:[NSNull class]]
。
您正在收到崩溃,因为您正在向integerValue
对象发送NSNull
。 NSNull
没有回复integerValue
并引发异常。
答案 1 :(得分:0)
首先应测试值是否为null,如果为null,则执行intValue方法可能会导致应用程序崩溃。 这样做应该这样做。
if ([[task valueForKey:@"filetype"] isKindOfClass:[NSNumber Class]] && 1 == [[task valueForKey:@"filetype"] integerValue]) {
// do something
} else {
// do something else
}
我希望它有所帮助。