使用FastJson转将对象转为字符串时出现"$ref"的情况解决

使用FastJson转将对象转为字符串时出现"$ref"的情况解决

转Json发现业务执行有问题,打断点一看,转出来的json是这样的

"files":[{"$ref":"$.formData.canWriteFiles.handwriting"},{"$ref":"$.formData.canWriteFiles.mainfile"}]

主要是因为引用的内存对象重复才会出现这种情况

FastJson对重复/循环引用的处理

首先,fastjson作为一款序列化引擎,不可避免的会遇到循环引用的问题,为了避免StackOverflowError异常,fastjson会对引用进行检测。

如果检测到存在重复/循环引用的情况,fastjson默认会以“引用标识”代替同一对象,而非继续循环解析导致StackOverflowError。

解决办法

  1. 避免重复引用内存对象,这当然是废话,直接看2吧
  2. 局部关闭FastJson的引用检测

    JSON.toJSONString(object, SerializerFeature.DisableCircularReferenceDetect);
  3. springboot全局关闭FastJson引用检测

    
    public class FastJsonHttpMessageConverterEx extends FastJsonHttpMessageConverter{
        public FastJsonHttpMessageConverterEx(){
            //在这里配置fastjson特性(全局设置的)
            FastJsonConfig fastJsonConfig = new FastJsonConfig();
            //fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");    //自定义时间格式
            //fastJsonConfig.setSerializerFeatures(SerializerFeature.WriteMapNullValue);  //正常转换null值
            //fastJsonConfig.setSerializerFeatures(SerializerFeature.DisableCircularReferenceDetect);     //关闭循环引用
            this.setFastJsonConfig(fastJsonConfig);
        }
     
        @Override
        protected boolean supports(Class<?> clazz) {
            return super.supports(clazz);
        }
    }
     
    @Configuration
    public class WebMvcConfigurer extends WebMvcConfigurerAdapter {
        .....
        @Bean
        public FastJsonHttpMessageConverterEx fastJsonHttpMessageConverterEx(){
            return new FastJsonHttpMessageConverterEx();
        }
    }
  4. 创建新的对象,避免内存地址相同

    // 创建新的对象
    Object newObj = new Object();
    // 使用org.springframework.beans.BeansUtils复制属性值
    BeansUtils.copyProperties(obj, newObj);
https://www.jianshu.com/p/6041242405e8
评论区
头像