FastJson解决long类型在前端界面展示精度丢失问题

Updated on in 编程技术 with 0 views and 0 comments

前后端交互的时候,数据的 ID 字段采用的雪花 ID,Long 类型,返回给前端时,由于数值过大,会导致精度丢失,后面几位会变成 0,这时候就需要把 ID 字段转成 String 类型的返回给前端页面。

目前有三种方式可以实现这个功能:

方式一、@JSONField

采用@JSONField 注解,在 ID 字段上加上如下的注解,即可返回前端字符串的 ID 数据

1@JSONField(serializeUsing = ToStringSerializer.class)

缺点:很明显,每个返回实体 model,只要有 ID,就需要添加注解,太过于繁琐

方式二、Long.class 转成 String.class

在全局配置中,将 Long 类型的字段转成 String 类型

 1@Configuration
 2public class CustomFastJsonConfig {
 3    @Bean
 4    FastJsonHttpMessageConverter fastJsonHttpMessageConverter() {
 5        //1.需要定义一个convert转换消息的对象
 6        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
 7  
 8        //2.添加fastJson的配置信息
 9        FastJsonConfig fastJsonConfig = new FastJsonConfig();
10        //3.设置Long为字符串
11        SerializeConfig serializeConfig = SerializeConfig.globalInstance;
12        serializeConfig.put(Long.class, ToStringSerializer.instance);
13        serializeConfig.put(Long.TYPE, ToStringSerializer.instance);
14        fastJsonConfig.setSerializeConfig(serializeConfig);
15
16        //4.在convert中添加配置信息.
17        converter.setFastJsonConfig(fastJsonConfig);
18        return converter;
19    }
20}

缺点:也很明显,后端返回的数据,只要是 Long 类型的字段,都会被转成 String 返回,导致扩大了转换范围

方式三、SerializeFilter

利用 FastJson 内置的 SerializeFilter,有很多,如下
image.png

  • PropertyPreFilter 根据 PropertyName 判断是否序列化;
  • PropertyFilter 根据 PropertyName 和 PropertyValue 来判断是否序列化;
  • NameFilter 修改 Key,如果需要修改 Key,process 返回值则可;
  • ValueFilter 修改 Value;
  • BeforeFilter 序列化时在最前添加内容;
  • AfterFilter 序列化时在最后添加内容。

这里主要用到的 SerializeFilter 为 ValueFilter,如下:

 1@Configuration
 2public class CustomFastJsonConfig {
 3    @Bean
 4    FastJsonHttpMessageConverter fastJsonHttpMessageConverter() {
 5        //1.需要定义一个convert转换消息的对象
 6        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
 7  
 8        //2.添加fastJson的配置信息
 9        FastJsonConfig fastJsonConfig = new FastJsonConfig();
10        //3.设置id字段为字符串
11        fastJsonConfig.setSerializeFilters((ValueFilter) (object, name, value) -> {
12            if ("id".equalsIgnoreCase(name)){
13                return value + "";
14            }
15            return value;
16        });
17
18        //4.在convert中添加配置信息.
19        converter.setFastJsonConfig(fastJsonConfig);
20        return converter;
21    }
22}

很明显,这个处理方式是最好的,这里是将 ID 字段转成 String,需要转换其他字段时,只需要新增相应的逻辑判断即可

完美解决。


标题:FastJson解决long类型在前端界面展示精度丢失问题
作者:kangaroo1122
地址:https://www.kangaroohy.com/articles/2021/09/02/1630569969423.html
声明:如非特别说明,版权归kangaroo1122 所有,转载请注明出处,谢谢!
签名:No pains, no gains.