JSON序列化導致Long類型被搞成Integer的坑及解決
JSON序列化導致Long類型被搞成Integer的坑
最近遇到一個錯誤,就是某個字段肯定是Long類型的,通過Map<String,Object>方式轉成JSON字符串,然後存到瞭DB的某個字段裡。
為瞭Json存儲字,然後反序列化為Map(不是自定義的常規對象)
比如某二方為瞭提供通用的接口能力,將Map<String,Object>的數據通過JSON序列化方式緩存然後JSON反序列化拿到Map。
等情況。
用的時候就通過Key獲取對象之後直接強轉Long,然後類型轉換異常。
java.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報錯
現象:通過查庫(mysql)獲取信息,其中有個字段A的值為int類型的5,然後在前端頁面,把數據(json)通過ajax請求到後臺(在前端頁面A的類型為Number),在後臺用Map<String, Object>接收json數據,此時A的值變為5.0瞭,從整型變為瞭浮點型。此時轉換成int會出現類型轉換異常。
問題:從前端頁面傳遞過來的json串,後臺能map接收,再利用map的get()方法獲取相應的屬性值,這時當屬性類型為int或者long類型時會出現轉換異常。
解決方法,先將相應的屬性轉換成Number類型,再調用Number對應的方法進行轉換。但有個地方需要註意,需要先判斷該屬性是否為空再進行轉換,否則會出現NullPointerException。
Gson轉換導致int轉換成double的問題
使用情景:後端返回的json字符串,通過gson處理後,原本是int類型,現在獲取到的是double類型的。
解決:
int i = ((Number)fromJson.get("int")).intValue(); int i = Math.round(Double.parseDouble(fromJson.get("int").toString));
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- Gson之toJson和fromJson方法的具體使用
- Android極光推送處理message遇到的坑解決
- JSON反序列化Long變Integer或Double的問題及解決
- 如何使用GSON解析JSON數據
- Java中Json與List、Map、entity的互相轉化