Long型別資料返回給前端丟失精度問題解決
阿新 • • 發佈:2020-12-11
技術標籤: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;
}
}
}
使用:在需要進行轉換的欄位上面用類註解標識