使用FastJson转将对象转为字符串时出现"$ref"的情况解决
转Json发现业务执行有问题,打断点一看,转出来的json是这样的
"files":[{"$ref":"$.formData.canWriteFiles.handwriting"},{"$ref":"$.formData.canWriteFiles.mainfile"}]
主要是因为引用的内存对象重复才会出现这种情况
FastJson对重复/循环引用的处理
首先,fastjson作为一款序列化引擎,不可避免的会遇到循环引用的问题,为了避免StackOverflowError异常,fastjson会对引用进行检测。
如果检测到存在重复/循环引用的情况,fastjson默认会以“引用标识”代替同一对象,而非继续循环解析导致StackOverflowError。
解决办法
- 避免重复引用内存对象,这当然是废话,直接看2吧
局部关闭FastJson的引用检测
JSON.toJSONString(object, SerializerFeature.DisableCircularReferenceDetect);
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(); } }
创建新的对象,避免内存地址相同
// 创建新的对象 Object newObj = new Object(); // 使用org.springframework.beans.BeansUtils复制属性值 BeansUtils.copyProperties(obj, newObj);
https://www.jianshu.com/p/6041242405e8
分别是哔哩哔哩序号35,小米运动序号2,米友社序号13,这个是同一个账号下运行的任务