gpt4 book ai didi

java - 递归对象到 JSON

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:21:13 25 4
gpt4 key购买 nike

假设我有以下代码:

public class A {
B b;

public A() {
this.b = new B(this);
}
}

public class B {
A a;

B(A a) {
this.a = a;
}

}

如您所见,这些对象(AB)相互引用,如果您尝试将对象转换为 JSON 代码,则会导致无限递归:A有 B,它和 A 一样,A 也有 B,等等,等等。

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

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

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

最佳答案

Jackson 有一些方法可以处理循环或双向依赖关系,特别是两种。

如果您必须向外界公开您的实体,我建议添加 @JsonIgnore在导致循环引用的属性上。这将告诉 Jackson 不要序列化该属性。但是,这意味着您必须在反序列化时再次自己引用它们(并且在序列化时,您必须向 JSON 数据结构添加一些内容才能知道在反序列化时再次引用什么)。

另一种方式,我想这更符合您的喜好,是使用 Jackson 提供的双向功能。您可以使用 @JsonManagedReference@JsonBackReference . @JsonManagedReference 是属性的“转发”部分,它将正常序列化。 @JsonBackReference 是引用的“后退”部分;它不会被序列化,但会在“forward”类型被反序列化时被重构。

您可以查看示例 here .

下面我将展示其中一个示例,以阐明一些事情

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

关于java - 递归对象到 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25847561/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com