MC *_*ror 6 java recursion json
假设我有以下代码:
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对象时重新应用递归?
Jackson 有一些方法来处理循环或双向依赖关系,特别是两种。
如果您必须将实体暴露给外界,我建议添加@JsonIgnore导致循环引用的属性。这将告诉杰克逊不要序列化该属性。但是,这意味着您必须在反序列化时再次亲自引用它们(并且在序列化时,您必须向 JSON 数据结构添加一些内容才能知道在反序列化时再次引用哪些内容)。
另一种方法,我怀疑这更符合您的喜好,是使用 Jackson 提供的双向功能。您可以使用@JsonManagedReference或@JsonBackReference。@JsonManagedReference是属性的“前向”部分,它将正常序列化。@JsonBackReference是参考文献的“后面”部分;它不会被序列化,但会在反序列化“forward”类型时被重建。
您可以在此处查看示例。
下面我将展示其中一个示例,应该可以澄清一些事情
public class NodeList {
    @JsonManagedReference
    public List<NodeForList> nodes; //this one gets serialized
}
public class NodeForList {
    public String name;
    @JsonBackReference 
    public NodeList parent; //this one wont get serialized, but will be reconstructed upon deserialization
    public NodeForList() { this(null); }
    public NodeForList(String n) { name = n; }
}