FastJson返回前端数据出现$ref的解决方案
两种解决方案。
第一种:添加
@JSONField(serialzeFeatures = SerializerFeature.DisableCircularReferenceDetect)
注释在对应出现$ref的属性上。
第二种:在fastJson的配置中:
public HttpMessageConverters fastJson() {
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
FastJsonConfig fastJsonConfig = new FastJsonConfig();
//fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
//可以在这里加上相关配置
fastJsonConfig.setSerializerFeatures(
SerializerFeature.PrettyFormat,
SerializerFeature.WriteDateUseDateFormat,
SerializerFeature.WriteNullNumberAsZero,
SerializerFeature.WriteNullListAsEmpty,
SerializerFeature.WriteNullStringAsEmpty,
SerializerFeature.WriteNullBooleanAsFalse);
//处理中文乱码问题
List<MediaType> fastMediaTypes = new ArrayList<>();
fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
fastConverter.setSupportedMediaTypes(fastMediaTypes);
fastConverter.setFastJsonConfig(fastJsonConfig);
return new HttpMessageConverters(fastConverter);
}
其中,前一种解决方案是针对单个出现这个问题的对象,第二个解决方案属于全局配置。
本身出现该问题的原因,是由于fastjson内部的对象引用机智造成的。
fastjson为了方式内存溢出,在对象转换json的时候,如果集合中两个对象a、b同时引用了第三个对象,在转换时首先被a引用,之后再被B引用时,就会使用$ref来代替原有引用,目的是为了防止数据栈溢出。
溢出情况举例。
A对象有个属性是B,引用了B对象,B对象属性中又属性A,引用了A对象,则会出现循环转换导致数据栈溢出。