问题描述
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