1. 程式人生 > 程式設計 >JSON序列化導致Long型別被搞成Integer的坑及解決

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型別的。

JSON序列化導致Long型別被搞成Integer的坑及解決

解決:

int i = ((Number)fromJson.get("int")).intValue();
int i = Math.round(Double.parseDouble(fromJson.get("int"程式設計客棧).toString));

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援我們。