鍍金池/ 問答/Java  網(wǎng)絡(luò)安全  HTML/ fastjson對于date類型的疑問

fastjson對于date類型的疑問

問題描述

在項目中遇到fastjson的轉(zhuǎn)化問題,在轉(zhuǎn)化Java Bean為JSONObject時。fastjson會將java.util.Date轉(zhuǎn)化為時間戳

在轉(zhuǎn)化為json對象后
獲取其中的date對象時使用出現(xiàn)異常
long birthday= (long) jsonObject.get("birthday");
經(jīng)測試所有日期時間戳的值在int最小值和最大值之間的日期,都會報一個錯:

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long

所以我這里有一個疑問,fastJson轉(zhuǎn)化為對象后,使用json.get("date")這里的獲得的對象到底是什么類型的,為什么會有這個bug

相關(guān)版本

jdk版本: 1.7
fastjson版本: 1.2.32

相關(guān)代碼

// 測試對象
public class Student{
    private Date birthday;
    
    // getter,setter...
}

// 測試方法
public static void main(String[] args) {
    Student student = new TestJson().new Student();
    // 正常時間類型。測試結(jié)果正常
    student.setBirthday(new Date());
    // 1970-01-01 異常。即使這里數(shù)字加l轉(zhuǎn)long。最后還是報錯
    student.setBirthday(new Date(-28800000));
    // 1970-01-02 異常。即使這里數(shù)字加l轉(zhuǎn)long。最后還是報錯
    student.setBirthday(new Date(57600000));
    // 2018-07-10 已經(jīng)大于int最大值,所以要加l。正常
    student.setBirthday(new Date(1531152000000l));
    // 1960-07-10 已經(jīng)小于int最小值,要加l。正常
    student.setBirthday(new Date(-299145600000l));
    
    JSONObject fastJson = JSONObject.parseObject(JSONObject.toJSONString(student));
    // 出錯的代碼。這里只要是時間戳位于int的最小值和最大值之間的時間戳。這樣調(diào)用都會報轉(zhuǎn)換異常的錯誤。我不知道這是為什么
    long birthday = (long) fastJson.get("birthday");
    
    // 如果使用下面四個方法,不管日期怎么設(shè)置都是正確的,不會報錯
    //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);        
}

最后總結(jié)

目前由于系統(tǒng)中存在生日時間戳在int最小值和最大值范圍內(nèi)的。所以產(chǎn)生了以上的異常。已經(jīng)使用 long birthday = fastJson.getLongValue("birthday"); 代替了原來的方法

但是還是不知道為什么出了異常,所以懇請各位知道的能告知一些?;蛘咧更c一下fastjson的源碼關(guān)鍵實現(xiàn)位置

回答
編輯回答
尐懶貓

時間戳一直是long,如果是Int早掛了,但long從現(xiàn)在的角度看也不夠了,我等有生之年應(yīng)該能等到那一天

2017年10月10日 05:46
編輯回答
貓小柒
 // 1970-01-01 異常。即使這里數(shù)字加l轉(zhuǎn)long。最后還是報錯
    student.setBirthday(new Date(-28800000));
    // 1970-01-02 異常。即使這里數(shù)字加l轉(zhuǎn)long。最后還是報錯
    student.setBirthday(new Date(57600000));

這兩個報錯的原因是因為HashMap的靜態(tài)內(nèi)部類Node里面的value的類型存儲的是Integer類型,強轉(zhuǎn)long報類轉(zhuǎn)換錯誤,其他三個存儲的是Long型的,所以不會報錯。
long birthday = fastJson.getLongValue("birthday"); 之所以不會報錯是因為把Integer轉(zhuǎn)為Long型的了。
圖片描述

2018年9月21日 12:37