fastjson对于date类型的疑问

发布于 2022-09-07 16:27:57 字数 1815 浏览 31 评论 0

问题描述

在项目中遇到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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

无人问我粥可暖 2022-09-14 16:27:57
 // 1970-01-01 异常。即使这里数字加l转long。最后还是报错
    student.setBirthday(new Date(-28800000));
    // 1970-01-02 异常。即使这里数字加l转long。最后还是报错
    student.setBirthday(new Date(57600000));

这两个报错的原因是因为HashMap的静态内部类Node里面的value的类型存储的是Integer类型,强转long报类转换错误,其他三个存储的是Long型的,所以不会报错。
long birthday = fastJson.getLongValue("birthday"); 之所以不会报错是因为把Integer转为Long型的了。
图片描述

香草可樂 2022-09-14 16:27:57

时间戳一直是long,如果是Int早挂了,但long从现在的角度看也不够了,我等有生之年应该能等到那一天

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文