Objective c 如何从SBJSON测试NSDictionary中的null?
我有一个API返回一个JSON编码的数据字符串,该字符串返回一个实数或“null”作为值。只要JSON包含一个数字或字符串值,一切都会正常工作。如果key:value对值为null,则下面的代码将崩溃 当NSDictionary objectForKey从SBJSON获取空值时,如何正确测试它 当API为文件类型返回null时,下面的代码在if()行崩溃 我的Objective-C代码尝试测试预期值:Objective c 如何从SBJSON测试NSDictionary中的null?,objective-c,ios5,xcode4.3,Objective C,Ios5,Xcode4.3,我有一个API返回一个JSON编码的数据字符串,该字符串返回一个实数或“null”作为值。只要JSON包含一个数字或字符串值,一切都会正常工作。如果key:value对值为null,则下面的代码将崩溃 当NSDictionary objectForKey从SBJSON获取空值时,如何正确测试它 当API为文件类型返回null时,下面的代码在if()行崩溃 我的Objective-C代码尝试测试预期值: if (1 == [[task valueForKey:@"filetype"] intege
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;
}
任务{
filename=“”;
filetype=“”;
tclid=3;
}
将数据从JSON传输到Cocoa集合时,该类用于表示“无值”,因为Cocoa集合不能有空插槽
是NSNull
打印自身的方式
要对此进行测试,可以使用someObject==[NSNull]
。它是一个单实例——每个进程只有一个NSNull
实例——因此指针比较是有效的,尽管您可能更喜欢遵循通常的Cocoa比较约定并使用[someObject iskindof class:[NSNull class]]
您之所以会发生崩溃,是因为您正在向该
NSNull
对象发送integerValue
NSNull
不响应integerValue
并引发异常。将数据从JSON传输到Cocoa集合时,该类用于表示“无值”,因为Cocoa集合不能有空插槽
是NSNull
打印自身的方式
要对此进行测试,可以使用someObject==[NSNull]
。它是一个单实例——每个进程只有一个NSNull
实例——因此指针比较是有效的,尽管您可能更喜欢遵循通常的Cocoa比较约定并使用[someObject iskindof class:[NSNull class]]
您之所以会发生崩溃,是因为您正在向该
NSNull
对象发送integerValue
NSNull
不响应integerValue
并引发异常。您应该首先测试是否有值为null,如果该值为null,则执行intValue方法可能会使应用程序崩溃。
这样做应该可以
if ([[task valueForKey:@"filetype"] isKindOfClass:[NSNumber Class]] && 1 == [[task valueForKey:@"filetype"] integerValue]) {
// do something
} else {
// do something else
}
我希望它能有所帮助。您应该首先测试是否有一个值为null,如果该值为null,则执行intValue方法可能会使应用程序崩溃。 这样做应该可以
if ([[task valueForKey:@"filetype"] isKindOfClass:[NSNumber Class]] && 1 == [[task valueForKey:@"filetype"] integerValue]) {
// do something
} else {
// do something else
}
我希望有帮助。这仍然会崩溃,因为对象不是
nil
,而是NSNull
单例。表达式的第一部分将为true,然后将intValue
发送到[NSNull null]
,它不会响应intValue
。如果对象为nil
(如果它在集合中则不可能),则发送intValue
不会崩溃。谢谢,我没有真正尝试过,我更新了答案以更正它。应该可以。这不会崩溃,但是仍然没有必要做第一个测试——如果它不是真的(字典中没有该键的值),那么第二个测试也不会是真的([nil isKindOfClass:
将像任何消息一样返回0到nil
)。因为表达式从左到右求值,[nil isKindOfClass:]不会发生,因为第一个表达式是假的。对,但是没有理由做第一个,因为如果第一个表达式是假的,第二个表达式永远不会是真的。您可以只使用第二个,并且具有相同的真值。这仍然会崩溃,因为对象不是nil
,而是NSNull
单例。表达式的第一部分将为true,然后将intValue
发送到[NSNull null]
,它不会响应intValue
。如果对象为nil
(如果它在集合中则不可能),则发送intValue
不会崩溃。谢谢,我没有真正尝试过,我更新了答案以更正它。应该可以。这不会崩溃,但是仍然没有必要做第一个测试——如果它不是真的(字典中没有该键的值),那么第二个测试也不会是真的([nil isKindOfClass:
将像任何消息一样返回0到nil
)。因为表达式从左到右求值,[nil isKindOfClass:]不会发生,因为第一个表达式是假的。对,但是没有理由做第一个,因为如果第一个表达式是假的,第二个表达式永远不会是真的。你可以使用第二个,并且有相同的真值。可能的重复(虽然我回答了,所以…我也给了Josh+1。)可能的重复(虽然我回答了,所以…我也给了Josh+1。)