Spring Boot中接口數據字段為?Long?類型時,前端number精度丟失問題解決方案
在Spring Boot中,當接口數據字段為?Long?類型時,返回頁面的JSON中該字段通常會被序列化為數字類型。
例如,一個Java對象中有一個?Long?類型的屬性?id?,值為?1234567890123L?,在返回的JSON中會表示為?{"id":1234567890123}?。
不過,JavaScript中?Number?類型的安全整數范圍是?-2^53?到?2^53?,如果?Long?類型的值超出這個范圍,在前端JavaScript處理時可能會出現精度丟失問題。為避免該問題,可以在將?Long?類型數據返回給前端時,將其轉換為?String?類型。可以使用?Jackson?的?@JsonSerialize?注解來實現,示例代碼如下:
java
import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
public class MyObject {
@JsonSerialize(using = ToStringSerializer.class)
private Long id;// 省略其他屬性和方法
} ? 這樣,在返回JSON時,?id?字段就會被序列化為字符串類型,能有效避免前端的精度丟失問題。
在Spring Boot中,可以通過配置?Jackson?來全局設置?Long?類型字段在返回JSON時序列化為字符串類型。 以下是兩種常見的方法:
1.通過配置類 創建一個?Jackson?的配置類,在類中定義一個?Bean?來配置?ObjectMapper?。示例代碼如下:
java
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;
@Configuration public class JacksonConfig {
@Bean
public ObjectMapper objectMapper() {ObjectMapper objectMapper = new ObjectMapper();SimpleModule module = new SimpleModule();// 將Long類型序列化為字符串module.addSerializer(Long.class, ToStringSerializer.instance);// 處理Long類型的數組或集合module.addSerializer(Long[].class, new ToStringSerializer(false));objectMapper.registerModule(module);return objectMapper;
}
} ?
2.通過應用配置文件 在?application.properties?或?application.yml?文件中添加配置,告訴?Jackson?將?Long?類型序列化為字符串。示例如下:
yaml
spring: jackson: serialization: WRITE_NUMBERS_AS_STRINGS: true ?
上述兩種方法都可以實現將?Long?類型字段全局序列化為字符串類型,你可以根據項目的實際情況選擇合適的方式。