iOS:比较NSString与"<null>"无效

12

我正在使用一个返回JSON的web服务。其中一个值我得到的是"< null >"

当我运行以下代码时,if语句仍会执行,尽管它不应该执行。

有任何原因吗?

NSDictionary *location = [dictionary valueForKey:@"geoLocation"];       //get the product name
NSString *latitude = [location valueForKey:@"latitude"];
NSLog(@"%@", latitude);

NSString *longitude = [location valueForKey:@"longitude"];

if (![latitude isEqual: @"<null>"] && ![longitude isEqual: @"<null>"]) {
    NSLog(@"%d", i);
    CLLocationCoordinate2D coordinate;
    coordinate.longitude = [latitude doubleValue];
    coordinate.longitude = [longitude doubleValue];
    [self buildMarketsList:coordinate title:title subtitle:nil]; //build the browse list product
}
4个回答

31
我正在使用返回JSON的Web服务。其中一个值是“< null >”。
啊哈。有两种可能性:
一、JSON不包含纬度和经度信息。在这种情况下,它们的键不在您收到的字典中,因此您实际上获得了一个nil(或NULL)指针。由于应用了否定,因此发送消息nil将返回零,因此两个条件都会触发。请尝试使用以下代码:
if (latitude != nil && longitude != nil)

永远不要依赖于对象的描述。

II. 可能 JSON 包含 null 值,而您正在使用的 JSON 解析器将 null 转换为 [NSNull null],然后您尝试将字符串与该 NSNull 进行比较。在这种情况下,请尝试以下操作:

if (![latitude isEqual:[NSNull null]] && ![longitude isEqual:[NSNull null]])

@Anupdas 谢谢。我不知道为什么有人认为这是错误的。 - user529758
1
@EliMiller 这是 [NSNull null] 的描述。你还应该更仔细地阅读 NSLog() 的文档。 - user529758

2
我曾遇到同样的问题,但是我通过以下方法解决了它: 将你的if语句替换为以下内容:
if (![latitude isKindOfClass:[NSNull class]] && ![longitude isKindOfClass:[NSNull class]])

0
if ([latitude isEqual:[NSNull null]])
{
 //do something
 latitude = @"";
}
else
{
 //do something else
 latitude = json value
}

这就是我要做的。因为我需要存储值,即使返回 null。


0
通常,如果您在JSON响应中收到null,则需要检查是否为NSNull
在您的情况下,您应该这样做:
if ( [location valueForKey:@"longitude"] == [NSNull null]) {
     // is null object
} 

2
请不要使用 == 来比较对象。 - user529758
1
从苹果的文档中可以看到,要测试一个空对象值,你必须进行直接的对象比较。在使用isEqual之前,他们使用==进行直接的对象比较。https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/NumbersandValues/Articles/Null.html - Albert Tong
@H2CO3 - 我几乎从不使用==比较对象,除非是这种情况...除非苹果的文档有误。 - Albert Tong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接