在項目中遇到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
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();
// 正常時間類型。測試結(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);
}
目前由于系統(tǒng)中存在生日時間戳在int最小值和最大值范圍內(nèi)的。所以產(chǎn)生了以上的異常。已經(jīng)使用 long birthday = fastJson.getLongValue("birthday"); 代替了原來的方法
但是還是不知道為什么出了異常,所以懇請各位知道的能告知一些。或者指點一下fastjson的源碼關(guān)鍵實現(xiàn)位置
// 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型的了。
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
北大青鳥中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團,成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達內(nèi)教育集團成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。