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。

推薦閱讀: