【问题标题】:What's the real type? NSString or NSNumber真正的类型是什么? NSString 或 NSNumber
【发布时间】:2012-03-04 10:40:54
【问题描述】:

我有一个 NSDictionary,其中包含从 json 数据转换而来的数据,例如 {"message_id":21}。 然后我使用NSNumber *message_id = [dictionary valueForKey:@"message_id"] 来获取数据。

但是当我使用这个message_id时,

Message *message = [NSEntityDescription ....
message.messageId = message_id;

我得到了运行时错误,assigning _NSCFString to NSNumber

所以我必须使用 NSNumberFormatter 进行转换。

NSString *messageId = [dictionary valueForKey:@"message_id"];
NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
[f setNumberStyle:NSNumberFormatterNoStyle];
message.messageId = [f numberFromString:messageId];

此代码有效。

但是我在调​​试的时候看到了message_id

NSNumber *message_id = [dictionary valueForKey:@"message_id"]

有一个有效值,21。

谁能看到这里的问题?

【问题讨论】:

  • 让我们看看MessagemessageId属性的声明。
  • @property (nonatomic, 保留) NSNumber * messageId;

标签: objective-c json nsstring nsnumber


【解决方案1】:

您正在尝试将 NSString 保存到 NSNumber。如果你想要它作为 NSNumber,你可以这样做:

NSNumber *message_id = [NSNumber numberWithInt:[[dictionary valueForKey:@"message_id"] intValue]];

这应该可以解决您的问题。

【讨论】:

  • 这个有什么问题? NSNumber *message_id = [字典 valueForKey:@"message_id"],变量 message_id 有一个有效值
  • 我不能确切地说为什么这不起作用,因为我不知道你字典中的值。但我的猜测是它返回一个 NSString 对象。这会导致错误。
  • 字典包含键“message_id”的值“21”。它是由 JSONKit 从 json 字符串 {"message_id":"21"} 生成的
  • 试试 NSLog(@"%@", [dictionary valueForKey:@"message_id"])。您将收到 NSString 或 NSCFString。而且你不能只把一个 NSString 对象放在一个 NSNumber 中。
  • statement NSNumber *message_id = [dictionary valueForKey:@"message_id"] 没有抛出任何错误,并且调试窗口显示它是一个 NSNumber 并且值等于 21。但是我在分配时遇到了错误, message.messageId = message_id;表示不能将 NSCFString 分配给 NSNumber
【解决方案2】:

您使用什么库进行转换? {"message_id":21} 表示值为 21 的 NSNumber 应作为 NSNumber 返回,{"message_id":"21"} 应将其作为 NSString 返回。

使用数字格式化程序完全是矫枉过正。使用方法“integerValue”,它对 NSString* 和 NSNumber* 都适用——无论对象是 NSString 还是 NSNumber,你都会得到整数 21。如果您的对象 NSNumber 而不是 NSString,格式化程序代码显然会遇到麻烦。

所以:message.messageId = [[NSNumber numberWithInteger:[messageId integerValue]];

我可能会在 NSDictionary 中添加一个类别

  • (NSNumber*)nsIntegerNumberForKey:(NSString*)key

它处理键不存在的情况,或者值是空值或字典或数组的情况,因此您可以在任何需要来自 JSON 文档的整数值的 NSNumber 并进行错误检查的地方使用它到处。

【讨论】:

    【解决方案3】:

    阅读此处SAVING JSON TO CORE DATAJSON official page

    JSON 标准对如何区分字符串和 数字——基本上,字符串用引号括起来,数字是 不是。然而,JSON Web 服务并不总是能很好地满足这个要求。即使它们是一致的,它们也并不总是从一个记录到另一个记录。

    因此,如果您收到首选 NSString 的 NSNumber,则必须自行检查和修复

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-23
      • 1970-01-01
      • 2011-10-02
      • 1970-01-01
      • 2011-04-07
      • 2013-03-22
      • 1970-01-01
      相关资源
      最近更新 更多