账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    fastjson对于date类型的疑问
    58
    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的源码关键实现位置

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • Favorite.莉 普通会员 1楼
      502 Bad Gateway

      502 Bad Gateway


      nginx
    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部