1. 程式人生 > 其它 >Long型別資料返回給前端丟失精度問題解決

Long型別資料返回給前端丟失精度問題解決

技術標籤:java前後端互動long型別資料返回精度丟失前後端互動java

前幾天做專案,遇到了一個小坑。一個插入資料的操作,在後端應用雪花演算法生成了資料的id,插入到庫中。id為long型別19位,但是當再次回顯給前端時,id值變了。前幾位都是一樣的,只是在後幾位中都變成了零。(由於時間太久,沒有保留截圖)

在網上差了一下原因和解決辦法,在此記錄一下,希望對大家有幫助。

我們前後端資料傳輸,會將返回的資料序列化為json字串,返回給前端,前端應用js進行資料解析,但是19位的字串id資料轉換成long型別時,由於位數太長丟失了精度,會將後幾位用零代替,所以前端顯示的就是丟失精度後的資料,當在此傳給後端時,後端並不能在資料庫中找到相應的資料,導致資料錯誤或者報錯。

其中一種解決辦法就是:
1、當我們將資料進行json序列化返回給前端時,先將位數比較多的long型別資料,轉換成string型別的資料,然後再封裝進json返回。
2、前端用js解析的時候,如果需要可以前端自己轉換成數字型別,如果不需要的話,其實string型別也是可以使用的(畢竟id只是作為一個標識,並不作計算使用)。
3、前端再次將資料返回傳入到後端的時候,後端需要將string型別的資料,再次轉換成Long型別進行後續的資料接收處理操作。

總結一下就是:返回資料前,long轉string。接收資料前,string轉Long。

那麼這時我們就需要使用一個工具類,來做這個轉換操作,程式碼如下:

/*
 * 類名稱: LongJsonSerializer
 * 類描述: 向前端返回時將Long轉成字串
*/
public class LongJsonSerializer extends JsonSerializer<Long> {
    @Override
    public void serialize(Long value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
        String text = (value == null ? null : String.valueOf(value));
        if (text != null) {
            jsonGenerator.writeString(text);
        }
    }
}
/*
 * 類名稱: LongJsonDeserializer
 * 類描述: 將接收的前端字串型別轉換成Long型別
*/
public class LongJsonDeserializer extends JsonDeserializer<Long> {
    private static final Logger logger = LoggerFactory.getLogger(LongJsonDeserializer.class);
 
    @Override
    public Long deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
        String value = jsonParser.getText();
        try {
            return value == null ? null : Long.parseLong(value);
        } catch (NumberFormatException e) {
            logger.error("資料轉換異常", e);
            return null;
        }
    }
}

使用:在需要進行轉換的欄位上面用類註解標識
在這裡插入圖片描述