【问题标题】:How do I test for null in NSDictionary from SBJSON?如何在 SBJSON 的 NSDictionary 中测试 null?
【发布时间】:2012-07-09 21:38:32
【问题描述】:

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

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

当 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;
}

【问题讨论】:

标签: objective-c ios5 xcode4.3


【解决方案1】:

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

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

您遇到崩溃是因为您将 integerValue 发送到该 NSNull 对象。 NSNull 不响应 integerValue 并引发异常。

【讨论】:

    【解决方案2】:

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

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

    希望对你有帮助。

    【讨论】:

    • 这仍然会崩溃,因为对象不是nil,而是NSNull 单例。表达式的第一部分为真,然后您将intValue 发送到[NSNull null],它不会响应intValue。如果对象 nil(如果它在集合中则不可能),发送intValue不会崩溃。
    • 谢谢,我还没有真正尝试过,我更新了答案以更正它。应该这样做。
    • 这不会崩溃,但仍然没有必要进行第一次测试——如果它不是真的(字典中那个键没有值)那么第二个也不会(@ 987654329@ 将像任何消息一样返回 0 nil)。
    • 由于表达式从左到右计算,[nil isKindOfClass:] 永远不会发生,因为第一个表达式将为假。
    • 对,但没有理由做第一个,因为如果第一个是假的,第二个将永远为真。您可以只使用第二个并具有相同的真值。
    猜你喜欢
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多