Json Long 类型精度丢失

发布时间 2023-03-22 21:16:10作者: DaleLee

1.现象

在 SpringBoot 项目中,使用 Jackson 将Java 对象转为 Json 传给前端,但 Java 对象有 Long 类型字段,传给前端后会出现精度丢失的现象。
比如发送的 Json 字符串如下所示:
image
但在前端显示时,却出现了精度丢失
image

2.原因

这是因为在JavaScript中,数字类型被限制为双精度浮点数,而Java中的Long类型是64位整数,超过了双精度浮点数的范围。
image

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 类型字段都会被转换为字符串类型。
image