问题场景
给前端返回候选城市列表时结果中出现这样的数据{“ r e f : ” ref:” ref:”[0]}。候选信息是从城市list中获取,然后放到返回集合中。
问题原因
看到结果中的 $ref 大概能猜到是因为从一个list集合中抓数据导致的,重复的数据指向同一个引用。
确实没有遇到过这种问题,只能求网上的大神们。问题的根源是fastjson默认开启引用检测机制,将相同对象写成引用的形式。
但怎么解决呢?
解决方案
有几种答案,我汇总一下。
- 单个关闭引用检测
JSON.toJSONString(object, SerializerFeature.DisableCircularReferenceDetect);
- 全局配置关闭引用检测
JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.DisableCircularReferenceDetect.getMask();
- 创建新对象
引用检测只会将相同对象转化为引用形式,那么新创建一个对象就不会被检测到。但这种方式有点low,不建议使用 - 不参与序列化
该方法不会将注解修饰的字段序列化,即不会放到json中,可以解决循环引用的问题。
@JSONField(serialize=false)
- 注解禁用引用检测
直接加在对象属性上即可,非常方便
@JSONField(serialzeFeatures=SerializerFeature.DisableCircularReferenceDetect)
参考资料: