文章目錄
- 一、前言
- 二、問題描述
- 2.1、問題背景
- 2.2、問題示例
- 三、解決方法
- 3.1、將ID轉換為字符串
- 3.2、使用@JsonSerialize注解
- 3.3、使用@JsonFormat注解
一、前言
在后端開發中,我們經常會遇到需要將ID作為標識符傳遞給前端的情況。當ID為long
類型時,如果該ID超過19位,前端JavaScript在處理時可能會遇到精度問題,導致最后兩位變成00
。本文將探討這一問題的原因以及解決方案。
二、問題描述
2.1、問題背景
在Java中,Long
類型的取值范圍是-9223372036854775808
到9223372036854775807
(即-2^64
到2^64-1
)。然而,JavaScript中的Number
類型取值范圍是-9007199254740992
到9007199254740991
(即-2^53
到2^53-1
)。當long類型的ID超過JavaScript的Number類型范圍時,就容易出現精度丟失的問題。
2.2、問題示例
響應報文Long類型的最后兩位變成了00
三、解決方法
3.1、將ID轉換為字符串
為了避免精度丟失,我們可以在后端將long類型的ID轉換為字符串。這樣,無論ID的長度如何,前端都可以正確地接收和處理。
3.2、使用@JsonSerialize注解
我們可以使用@JsonSerialize
注解來指定ID字段的序列化方式。通過ToStringSerializer
類,我們可以確保ID在序列化時被轉換為字符串。
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.AllArgsConstructor;
import lombok.Data;@Data
@AllArgsConstructor
public class Student {@JsonSerialize(using = ToStringSerializer.class)private long id;private String name;
}
注意:
添加@JsonSerialize
注解后,雖然實體類中id類型是Long,但是返回值中是String類型。
3.3、使用@JsonFormat注解
可以使用@JsonFormat(shape = JsonFormat.Shape.STRING)
將字段轉換為String類型
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;@Data
@AllArgsConstructor
public class Student {@JsonFormat(shape = JsonFormat.Shape.STRING)private long id;private String name;
}
響應報文示例: