0

我有一个 API 返回一个 JSON 编码的数据字符串,该字符串返回一个实数或“null”作为值。只要 JSON 包含数字或字符串值,一切都会按预期工作。如果 key:value 对的值为 null,则下面的代码会崩溃。

从 SBJSON 获取 NULL 时,如何正确测试 NSDictionary objectForKey?

当 API为 filetype 返回 null 时,下面的代码会在 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;
}
4

2 回答 2

5

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

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

您正在崩溃,因为您正在发送integerValue到该NSNull对象。NSNull不响应integerValue并引发异常。

于 2012-07-09T21:41:58.673 回答
0

您应该首先测试是否有一个值为 null,如果它为 null,则执行 intValue 方法可能会使您的应用程序崩溃。这样做应该可以。

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

我希望它有所帮助。

于 2012-07-09T21:43:46.180 回答