【发布时间】:2014-11-08 22:49:29
【问题描述】:
假设我有以下代码:
public class A {
B b;
public A() {
this.b = new B(this);
}
}
public class B {
A a;
B(A a) {
this.a = a;
}
}
如您所见,这些对象(A 和 B)相互引用,如果您尝试将对象转换为 JSON 代码,则会导致无限递归:A 有 B,它与 A 相同,它具有相同的 B,等等,等等。
但是,如果我尝试将这些对象转换为 JSON,例如使用 Gson,由于递归(顺便说一句,这是完全合乎逻辑的),StackOverflowError 会引发。
现在 JSON 中有没有一种方法可以声明这样的递归?如果没有,那么有没有办法在 JSON 中处理这种递归?
还是我必须手动检查递归,删除它,将对象转换为 JSON,然后在将 JSON 字符串重建为 Java 对象时重新应用递归?
【问题讨论】:
-
您希望它们在 JSON 中的外观如何?
-
第一个问题:为什么会存在这种相互依赖关系?通常它是糟糕设计的一个指标。
-
您不能在 JSON 中表示具有循环的网络。网络必须是没有交叉连接的纯树。
-
@nablex - 网络中有循环的原因有很多。一个普通的旧双向链表,例如。
-
请注意,在任何其他语言中,您(通常)会编写自己的 JSON 对象转换函数,这不会有问题。但是在 Java 中工作的人被 Jacksonesque 工具所吸引,并没有学习如何处理纯 JSON。