1.现象
在 SpringBoot 项目中,使用 Jackson 将Java 对象转为 Json 传给前端,但 Java 对象有 Long 类型字段,传给前端后会出现精度丢失的现象。
比如发送的 Json 字符串如下所示:
但在前端显示时,却出现了精度丢失
2.原因
这是因为在JavaScript中,数字类型被限制为双精度浮点数,而Java中的Long类型是64位整数,超过了双精度浮点数的范围。
3.解决方法
解决这个问题的方法是在 Jackson 序列化时将 Long 类型转换为字符串类型。可以使用 Jackson 的 @JsonFormat
注解来指定转换规则,例如:
@JsonFormat(shape = JsonFormat.Shape.STRING)
private Long myLongField;
这样,当Jackson序列化该对象时,myLongField字段将被转换为字符串类型,从而避免精度丢失问题。
另外,如果 Java 对象有很多 Long 类型字段,也可以通过配置 Jackson 的 ObjectMapper 来全局设置该规则,例如:
@Configuration
public class JacksonConfig {
@Bean
public Jackson2ObjectMapperBuilderCustomizer customizer() {
return builder -> builder.serializerByType(Long.class, new ToStringSerializer());
}
}
这样配置后,所有 Java 对象中的 Long 类型字段都会被转换为字符串类型。