fastjson对于date类型的疑问
问题描述
在项目中遇到fastjson的转化问题,在转化Java Bean为JSONObject时。fastjson会将java.util.Date转化为时间戳
在转化为json对象后
获取其中的date对象时使用出现异常
long birthday= (long) jsonObject.get("birthday");
经测试所有日期时间戳的值在int最小值和最大值之间的日期,都会报一个错:
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long
所以我这里有一个疑问,fastJson转化为对象后,使用json.get("date")这里的获得的对象到底是什么类型的,为什么会有这个bug
相关版本
jdk版本: 1.7
fastjson版本: 1.2.32
相关代码
// 测试对象
public class Student{
private Date birthday;
// getter,setter...
}
// 测试方法
public static void main(String[] args) {
Student student = new TestJson().new Student();
// 正常时间类型。测试结果正常
student.setBirthday(new Date());
// 1970-01-01 异常。即使这里数字加l转long。最后还是报错
student.setBirthday(new Date(-28800000));
// 1970-01-02 异常。即使这里数字加l转long。最后还是报错
student.setBirthday(new Date(57600000));
// 2018-07-10 已经大于int最大值,所以要加l。正常
student.setBirthday(new Date(1531152000000l));
// 1960-07-10 已经小于int最小值,要加l。正常
student.setBirthday(new Date(-299145600000l));
JSONObject fastJson = JSONObject.parseObject(JSONObject.toJSONString(student));
// 出错的代码。这里只要是时间戳位于int的最小值和最大值之间的时间戳。这样调用都会报转换异常的错误。我不知道这是为什么
long birthday = (long) fastJson.get("birthday");
// 如果使用下面四个方法,不管日期怎么设置都是正确的,不会报错
//long birthday = (long) fastJson.getInteger("birthday");
//long birthday = (long) fastJson.getIntValue("birthday");
//long birthday = fastJson.getLongValue("birthday");
//long birthday = fastJson.getLong("birthday");
System.out.println(birthday);
}
最后总结
目前由于系统中存在生日时间戳在int最小值和最大值范围内的。所以产生了以上的异常。已经使用 long birthday = fastJson.getLongValue("birthday"); 代替了原来的方法
但是还是不知道为什么出了异常,所以恳请各位知道的能告知一些。或者指点一下fastjson的源码关键实现位置
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这两个报错的原因是因为HashMap的静态内部类Node里面的value的类型存储的是Integer类型,强转long报类转换错误,其他三个存储的是Long型的,所以不会报错。
long birthday = fastJson.getLongValue("birthday"); 之所以不会报错是因为把Integer转为Long型的了。
时间戳一直是long,如果是Int早挂了,但long从现在的角度看也不够了,我等有生之年应该能等到那一天