FastJson解决long类型在前端界面展示精度丢失问题
    
  
      
      
     
    
      
        前后端交互的时候,数据的ID字段采用的雪花ID,Long类型,返回给前端时,由于数值过大,会导致精度丢失,后面几位会变成0,这时候就需要把ID字段转成String类型的返回给前端页面。
目前有三种方式可以实现这个功能:
方式一、@JSONField
采用@JSONField注解,在ID字段上加上如下的注解,即可返回前端字符串的ID数据
| 1
 | @JSONField(serializeUsing = ToStringSerializer.class)
 | 
缺点:很明显,每个返回实体 model,只要有ID,就需要添加注解,太过于繁琐
方式二、Long.class转成String.class
在全局配置中,将Long类型的字段转成String类型
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 
 | @Configurationpublic class CustomFastJsonConfig {
 @Bean
 FastJsonHttpMessageConverter fastJsonHttpMessageConverter() {
 
 FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
 
 
 FastJsonConfig fastJsonConfig = new FastJsonConfig();
 
 SerializeConfig serializeConfig = SerializeConfig.globalInstance;
 serializeConfig.put(Long.class, ToStringSerializer.instance);
 serializeConfig.put(Long.TYPE, ToStringSerializer.instance);
 fastJsonConfig.setSerializeConfig(serializeConfig);
 
 
 converter.setFastJsonConfig(fastJsonConfig);
 return converter;
 }
 }
 
 | 
缺点:也很明显,后端返回的数据,只要是Long类型的字段,都会被转成String返回,导致扩大了转换范围
方式三、SerializeFilter
利用FastJson内置的SerializeFilter,有很多,如下

- PropertyPreFilter 根据PropertyName判断是否序列化;
- PropertyFilter 根据PropertyName和PropertyValue来判断是否序列化;
- NameFilter 修改Key,如果需要修改Key,process返回值则可;
- ValueFilter 修改Value;
- BeforeFilter 序列化时在最前添加内容;
- AfterFilter 序列化时在最后添加内容。
这里主要用到的SerializeFilter为ValueFilter,如下:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 
 | @Configurationpublic class CustomFastJsonConfig {
 @Bean
 FastJsonHttpMessageConverter fastJsonHttpMessageConverter() {
 
 FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
 
 
 FastJsonConfig fastJsonConfig = new FastJsonConfig();
 
 fastJsonConfig.setSerializeFilters((ValueFilter) (object, name, value) -> {
 if ("id".equalsIgnoreCase(name)){
 return value + "";
 }
 return value;
 });
 
 
 converter.setFastJsonConfig(fastJsonConfig);
 return converter;
 }
 }
 
 | 
很明显,这个处理方式是最好的,这里是将ID字段转成String,需要转换其他字段时,只需要新增相应的逻辑判断即可
完美解决。