递归到JSON的对象

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,这些对象(AB)是指彼此,如果您尝试将对象转换为JSON代码,则会导致无限递归:A具有B,其具有相同的A,具有相同的B,等等,等等等等.

但是如果我尝试将这些对象转换为JSON,例如使用Gson StackOverflowError,则由于递归而引发(顺便说一下,这是完全合乎逻辑的).

现在有一种方法可以在JSON中声明这样的递归吗?如果没有,那么有没有办法在JSON中处理这种递归?

或者我是否必须手动检查递归,删除它,将对象转换为JSON,并在将JSON字符串重建为Java对象时重新应用递归?

ste*_*ong 3

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; }
}
Run Code Online (Sandbox Code Playgroud)