如何在SBJSON中测试NSDictionary中的null?

时间:2012-07-09 21:38:33

标签: objective-c ios5 xcode4.3

我有一个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;
}

2 个答案:

答案 0 :(得分:5)

将数据从JSON传输到Cocoa集合时,NSNull类用于表示“无值”,因为Cocoa集合不能有空插槽。 <null>NSNull打印自己的方式。

要对此进行测试,您可以使用someObject == [NSNull null]。它是一个单例 - 每个进程只有一个NSNull实例 - 所以指针比较有效,尽管您可能更喜欢遵循通常的Cocoa比较约定并使用[someObject isKindOfClass:[NSNull class]]

您正在收到崩溃,因为您正在向integerValue对象发送NSNullNSNull没有回复integerValue并引发异常。

答案 1 :(得分:0)

首先应测试值是否为null,如果为null,则执行intValue方法可能会导致应用程序崩溃。 这样做应该这样做。

if ([[task valueForKey:@"filetype"] isKindOfClass:[NSNumber Class]] && 1 == [[task valueForKey:@"filetype"] integerValue]) {
    // do something
} else {
     // do something else
}

我希望它有所帮助。