【问题标题】:Server response == 0 interpreted as Boolean YES服务器响应 == 0 解释为布尔值 YES
【发布时间】:2014-05-16 20:26:33
【问题描述】:

我在一个值为0 的JSON 对象中收到服务器响应。我想将此解释为FALSENO,但我得到相反的结果。我究竟做错了什么?谢谢。

NSString *text=[[NSString alloc]initWithData:d.receivedData encoding:NSUTF8StringEncoding];
NSLog(@"%@", text);
self.response = [NSJSONSerialization JSONObjectWithData:d.receivedData options:kNilOptions error:nil];
NSLog(@"%@", [[self.response valueForKey:@"message"] valueForKey:@"app_version_status"]);
int temp = (int)[[self.response valueForKey:@"message"] valueForKey:@"app_version_status"];
NSLog(@"%d", temp);
NSLog(temp ? @"yes" : @"no");

这是我的控制台输出:

2014-05-16 14:18:35.819 MyApp[4410:60b] {"result":"success","message":{"app_version_status":0}}
2014-05-16 14:18:35.847 MyApp[4410:60b] 0
2014-05-16 14:18:35.847 MyApp[4410:60b] 3  //<-- What???
2014-05-16 14:18:35.847 MyApp[4410:60b] yes

【问题讨论】:

  • 任何非 0 数在 C(和 Objective-C)的条件中都是“真”,因此可以丢弃该部分。然后只关注演员表 - 演员表之前的值是多少?
  • 但是服务器响应是'0'。这使它为零,对吗?
  • 如果服务器响应是非零的字符“0”。

标签: objective-c json boolean


【解决方案1】:

如果您将强制转换为 int,您将收到一个错误,告诉您究竟出了什么问题 — 您得到的是一个 object,而不是一个 int。在这种情况下,它可能是一个 NSNumber。如果你想要一个 int,请询问它的 intValue

一般来说,对选角非常保守是件好事。如果您遇到类型错误,除非您 100% 确定它是虚假的,否则不要使用强制类型转换使其消失。如果有一个真正的错误,它可能仍然存在于演员表中,但现在你已经告诉编译器你不想听到它。

【讨论】:

  • 知道了。谢谢! (只要允许,我就会接受)。
  • "[I]这可能是一个 NSNumber。"鉴于它是从 JSON 反序列化的,它不会是 NSString 吗?无论如何,关于避免滥用演员表的极好建议。 +1 仅此而已。 :-)
【解决方案2】:

self.response 实际上是一个NSNumber 对象。它不是0 的标量值,它是一个具有内部属性的对象,其计算结果为0

通过将对对象的引用(可以说是指针)类型转换为 int,您实际上得到了指针的值(我有点惊讶的是它“只有”3),而不是任何属性的值的对象。

(从 C 的角度来看,obj-c 是对 C 的扩展,对象在内存中的表示方式与任何 C 结构一样。)

然后您继续使用您的指针并尝试将其评估为boolean。任何与0 不同的值,以及30 不同的值都将评估为TRUE。只有 0 评估为 FALSE。

尝试使用

NSNumber myIntNumber = self.response;
NSLog (@"%@", myIntNumber), 
NSLog (@"%d", [myIntNumber intValue]);
NSLog (@"%d", [myIntNumber booleanValue]);
NSLog (@"%d", [myIntNumber booleanValue] ? @"yes" : @"no");

...你会明白的。

【讨论】:

  • 它是 3,因为现在 Objective-C 使用标记指针。 IIRC 低位 1 表示它被标记,下一位 1 表示它是一个数字,其余位为 0 因为数字为 0,所以你得到位模式0000…0011,看起来像整数 3。(标签的工作方式可能与我记忆中的略有不同,但总体思路是这样的。)
  • @Chuck,很有趣。谢谢。
  • 考虑到@Chuck 的评论,这意味着 self.response 为空,而不是带有 0 值的 NSNumber。但我不明白为什么。
  • 它不为 NULL。 AFAIK 它是代表数字 0 的标记指针值,与您从 [NSNumber numberWithInt:0] 获得的相同。 NULL 仍然全为零。
  • 我想我明白了。谢谢。
猜你喜欢
  • 2016-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-13
  • 1970-01-01
  • 1970-01-01
  • 2018-02-16
相关资源
最近更新 更多