Jackson long类型转换时精度丢失

问题描述

Java 的 long 类型的范围,比 JavaScript 的 Number 类型的范围大

所以 Java 的 long 类型,转成 Json 时,会导致精度丢失

场景:

  • 雪花算法

解决

将 Java 的 long 类型,转成 Json 时,转成 字符串

方式一

使用 @JsonSerialize 注解

@JsonSerialize(using = ToStringSerializer.class)
private Long id;

方式二

自定义ObjectMapper,会将所有的 Long 类型,转成 字符串

/**
     * 解决Jackson导致Long型数据精度丢失问题
     * @return
     */
    @Bean("jackson2ObjectMapperBuilderCustomizer")
    public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
        Jackson2ObjectMapperBuilderCustomizer customizer = new Jackson2ObjectMapperBuilderCustomizer() {
            @Override
            public void customize(Jackson2ObjectMapperBuilder jacksonObjectMapperBuilder) {
                jacksonObjectMapperBuilder.serializerByType(Long.class, ToStringSerializer.instance)
                        .serializerByType(Long.TYPE, ToStringSerializer.instance);
            }
        };
        return customizer;
    }

}

方式三

在yml或properties中增加配置

  jackson:
    generator:
      write_numbers_as_strings: true

该方式会强制将所有数字全部转成字符串输出,这种方式的优点是使用方便,不需要调整代码;

缺点是颗粒度太大,所有的数字都被转成字符串输出了,包括按照timestamp格式输出的时间也是如此。

参考:

https://blog.csdn.net/SkyFire1121/article/details/91383772
https://blog.csdn.net/liubinwyzbt/article/details/103036347


原文出处:/show_1IX6xvUJBEXh.html