什么是真正的类型? NSString或NSNumber

时间:2012-03-04 10:40:55

标签: objective-c json nsstring nsnumber

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

但是当我使用这个message_id时,

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

我收到了运行时错误,将_NSCFString分配给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。

有人能在这看到问题吗?

3 个答案:

答案 0 :(得分:3)

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

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

这可以解决您的问题。

答案 1 :(得分:1)

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

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

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

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

  • (的NSNumber *)nsIntegerNumberForKey:(的NSString *)键

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

答案 2 :(得分:0)

请阅读SAVING JSON TO CORE DATAJSON official page

  

JSON标准非常清楚如何区分字符串   数字 - 基本上,字符串被引号和数字包围   不。但是,JSON Web服务并不总是能够满足这一要求。即使它们存在,但从一个记录到另一个记录并不总是一致的。

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