编辑
2025-06-14
BUG问题
00
请注意,本文编写于 102 天前,最后修改于 8 天前,其中某些信息可能已经过时。

目录

理解 JSON.toJSONString 出现 "$ref": "$.custField528"
现象说明
常见原因
解决方案
1. 忽略循环引用(如果不重要)
2. 使用不同的序列化方式
3. 使用注解标记类
4. 自定义序列化
最佳实践
FastJSON 特定解决方案
json
"$ref" : "$.xxx"

AI解答:

理解 JSON.toJSONString 出现 "$ref": "$.custField528"

这是 Java 对象序列化为 JSON 时遇到循环引用时的引用标记。

现象说明

当你在 JSON 输出中看到 "$ref": "$.custField528" 时,表示:

  1. JSON 序列化工具(可能是 FastJSON、Jackson 等)检测到对象中存在循环引用
  2. 为了避免无限递归,序列化器使用引用标记指向之前已经出现过的相同对象

常见原因

  • 循环引用:对象A引用对象B,对象B又引用对象A
  • 重复对象:同一个对象实例在对象图中多次出现

解决方案

1. 忽略循环引用(如果不重要)

java
// FastJSON 方式 JSON.toJSONString(object, SerializerFeature.DisableCircularReferenceDetect);

2. 使用不同的序列化方式

使用 Jackson:

java
ObjectMapper mapper = new ObjectMapper(); mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); String json = mapper.writeValueAsString(object);

3. 使用注解标记类

使用 Jackson 注解:

java
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id") public class MyClass { // 类定义... }

4. 自定义序列化

可以实现自定义序列化器来处理循环引用。

最佳实践

如果需要在 JSON 中保持对象引用,$ref 标记实际上是一个好的解决方案。如果不需要,可以配置序列化器:

  1. 忽略循环引用,或者
  2. 将反向引用设为 null

选择哪种方式取决于你是否需要将 JSON 反序列化回 Java 对象时保持相同的引用结构。

FastJSON 特定解决方案

如果是使用 FastJSON 出现的这个问题,可以:

java
// 方式1:禁用循环引用检测 String json = JSON.toJSONString(obj, SerializerFeature.DisableCircularReferenceDetect); // 方式2:使用非引用模式 String json = JSON.toJSONString(obj, SerializerFeature.DisableCheckSpecialChar);

如果问题仍未解决,可能需要检查你的对象结构,看看是否有不必要的循环引用可以优化。

本文作者:tiger

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!