JSON序列化導致Long類型被搞成Integer的坑及解決
JSON序列化導致Long類型被搞成Integer的坑
最近遇到一個錯誤,就是某個字段肯定是Long類型的,通過Map<String,Object>方式轉成JSON字符串,然后存到了DB的某個字段里。
為了Json存儲字,然后反序列化為Map(不是自定義的常規(guī)對象)
比如某二方為了提供通用的接口能力,將Map<String,Object>的數(shù)據通過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接收,如果數(shù)字小于Interger的最大值,給轉成了Integer!
方案
參見我的 另外一篇文章 JSON 反序列化 Long 變 Integer 或 Double 問題
思考
總之開發(fā)中盡量不要亂用一些對象屬性轉換工具,導致屬性漏掉或者轉錯。
不要濫用Map或者JSONObject來傳遞參數(shù)。
如果是含Object類型JSON序列化要特別小心上述問題!!
JSON格式轉int/long報錯
現(xiàn)象:通過查庫(mysql)獲取信息,其中有個字段A的值為int類型的5,然后在前端頁面,把數(shù)據(json)通過ajax請求到后臺(在前端頁面A的類型為Number),在后臺用Map<String, Object>接收json數(shù)據,此時A的值變?yōu)?.0了,從整型變?yōu)榱烁↑c型。此時轉換成int會出現(xiàn)類型轉換異常。
問題:從前端頁面?zhèn)鬟f過來的json串,后臺能map接收,再利用map的get()方法獲取相應的屬性值,這時當屬性類型為int或者long類型時會出現(xiàn)轉換異常。
解決方法,先將相應的屬性轉換成Number類型,再調用Number對應的方法進行轉換。但有個地方需要注意,需要先判斷該屬性是否為空再進行轉換,否則會出現(xiàn)NullPointerException。

Gson轉換導致int轉換成double的問題
使用情景:后端返回的json字符串,通過gson處理后,原本是int類型,現(xiàn)在獲取到的是double類型的。

解決:
int i = ((Number)fromJson.get("int")).intValue();
int i = Math.round(Double.parseDouble(fromJson.get("int").toString));
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Mybatis-Plus字段策略FieldStrategy的使用
本文主要介紹了Mybatis-Plus字段策略FieldStrategy的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-08-08
詳解關于IntelliJ IDEA中Schedule for Addition 的問題
本篇文章主要介紹了詳解關于 IntelliJ IDEA 中 Schedule for Addition 的問題,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-12-12
IntelliJ IDEA 2020.3 重大特性(新功能一覽)
這篇文章主要介紹了IntelliJ IDEA 2020.3 重大特性(新功能一覽),本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12

