JSON序列化導致Long型別被搞成Integer的坑及解決
目錄
- ON序列化導致Long型別被搞成Integer的坑
- 上程式碼
- 方案
- 思考
- JSON格式轉int/long報錯
- Gson轉換導致int轉換成double的問題
JSON序列化導致Long型別被搞成Integer的坑
最近遇到一個錯誤,就是某個欄位肯定是Long型別的,通過Map<String,Object>方式轉成JSON字串,然後存到了DB的某個欄位裡。
為了Json儲存字,然後反序列化為Map(不是自定義的常規物件)
比如某二方為了提供通用的介面能力,將Map<String,Object>的資料通過JSON序列化方式快取然後JSON反序列化拿到Map。
等情況。
用的時候就通過Key獲取物件之後直接強轉Long,然後型別轉換異常。
.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long
上程式碼
@Test(expected = ClassCastException.class) public void testJson() { String id = "id"; String name = "name"; Long idValue = 3000L; Map<String,Object> data = new HashMap<>(2); data.put(id,idValue); data.put(name,"張三"); Assert.assertEquals(idValue,(Long) data.get(id)); String jsonString =JSON.toJSONString(data); // 反序列化時Long被轉為了Integer Map map = JSON.parseObject(jsonString,Map.class); Object idObj = map.get(id); Assert.assertTrue(idObj instanceof Integer); Assert.assertEquals(idValue,(Long) idObj); }
沒用通過JSON序列化,雖然型別為Object,但是實際的型別為Long。
序列化為Json時後,Josn串是沒有 Long型別的,而且反轉回來也是Object接收,如果數字小於Interger的最大值,給轉成了Integer!
方案
參見我的 另外一篇文章 JSON 反序列化 Long 變 Integer 或 Double 問題
思考
總之開發中儘量不要亂用一些物件屬性轉換工具,導致屬性漏掉或者轉錯。
不要濫用Map或者JSONObject來傳遞引數。
如果是含Object型別JSON序列化要特別小心上述問題!!
JSON格式轉int/long報錯
現象:通過查庫()獲取資訊,其中有個欄位A的值為int型別的5,然後在前端頁面,把資料(json)通過ajax請求到後臺(在前端頁面A的型別為Number),在後臺用Map<String,Object>接收json資料,此時A的值變為5.0了,從整型變為了浮點型。此時轉換成int會出現型別轉換異常。
問題:從前端頁面傳遞過來的json串,後臺能map接收,再利用map的get()方法獲取相應的屬性值,這時當屬性型別為int或者long型別時會出現轉換異常。
解決方法,先將相應的屬性轉換成Number型別,再呼叫Number對應的方法進行轉客棧換。但有個地方需要注意,需要先判斷該屬性是否為空再進行轉換,否則會出現Nwww.cppcns.comullPointerException。
Gson轉換導致int轉換成double的問題
使用情景:後端返回的json字串,通過gson處理後,原本是int型別,現在獲取到的是double型別的。
解決:
int i = ((Number)fromJson.get("int")).intValue();
int i = Math.round(Double.parseDouble(fromJson.get("int"程式設計客棧).toString));
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援我們。