我有一个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。
有人能在这看到问题吗?
答案 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的地方使用它来获取JSON文档中的整数值并进行错误检查到处。
答案 2 :(得分:0)
请阅读SAVING JSON TO CORE DATA和JSON official page
JSON标准非常清楚如何区分字符串 数字 - 基本上,字符串被引号和数字包围 不。但是,JSON Web服务并不总是能够满足这一要求。即使它们存在,但从一个记录到另一个记录并不总是一致的。
因此,如果您已收到首选NSString的NSNumber,则必须检查并自行修复