尝试双向映射时 Java 中的对象递归
Object Recursion in Java while trying for bi-directional mapping
我有两个 类,它们具有双向关系,并且由于其设置方式而存在递归对象结构问题。
Employer employer = new Employer();
employer.setName("sample1");
Employee empl = new Employee();
List<Employer> listOfEmployers = new ArrayList<Employer>();
listOfEmployers.add(employer); //i am assuming this part of code is causing recursion issue
empl.setEmployers(listOfEmployers);
employer.setEmployee(empl); //will have recursive object structure
将 java 对象转换为 JSON 时会导致问题(org.codehaus.jackson.map.JsonMappingException:无限递归).因此,jackson 无法将 java 对象处理成 JSON。
但是,您能帮我了解一下 Java 幕后到底发生了什么来解决根本原因吗?
在 java 层中没有出现递归问题的情况下,在 Employer 和 Employee 之间形成这种映射的正确对象模型是什么?
如果您有两个对象,a
和 b
,这两个对象都有一个指向另一个的 v
成员:
A a = new A();
B b = new B();
a.name = "a";
a.v = b;
b.name = "b"
b.v = a;
那么,您打算如何将其表示为 JSON?或者作为任何其他串行数据格式?:
{
"name": "a",
"v": {
"name": "b",
"v": {
"name": "a",
"v": {
"name": "b",
"v": {
"name": "a",
"v": {
"name": "b",
"v": {
"name": "a",
"v": {
"name": "b",
"v": {
...永远
JSON 没有处理这个问题的标准方法。您可以通过显式键间接引用来解决它:
{
"key1": {
"name": "a",
"v_key" : "key2"
},
"key2": {
"name": "b",
"v_key": "key1"
}
}
在 Java 中,这可以通过以下方式实现:
Map<String,Object> map = new HashMap<String,Object>();
A a = new A();
a.name = "a";
map.add("a", a);
B b = new B();
b.name = "b";
map.add("b", b);
a.v_key = "b";
b.v_key = "a";
您还没有告诉我们您正在使用什么 JSON 库。它可能具有使用与上述类似的方法自动处理循环依赖性的方法。在其文档中搜索单词 "cyclic"。
(对于杰克逊,请参阅:Infinite Recursion with Jackson JSON and Hibernate JPA issue)
我有两个 类,它们具有双向关系,并且由于其设置方式而存在递归对象结构问题。
Employer employer = new Employer();
employer.setName("sample1");
Employee empl = new Employee();
List<Employer> listOfEmployers = new ArrayList<Employer>();
listOfEmployers.add(employer); //i am assuming this part of code is causing recursion issue
empl.setEmployers(listOfEmployers);
employer.setEmployee(empl); //will have recursive object structure
将 java 对象转换为 JSON 时会导致问题(org.codehaus.jackson.map.JsonMappingException:无限递归).因此,jackson 无法将 java 对象处理成 JSON。
但是,您能帮我了解一下 Java 幕后到底发生了什么来解决根本原因吗?
在 java 层中没有出现递归问题的情况下,在 Employer 和 Employee 之间形成这种映射的正确对象模型是什么?
如果您有两个对象,a
和 b
,这两个对象都有一个指向另一个的 v
成员:
A a = new A();
B b = new B();
a.name = "a";
a.v = b;
b.name = "b"
b.v = a;
那么,您打算如何将其表示为 JSON?或者作为任何其他串行数据格式?:
{
"name": "a",
"v": {
"name": "b",
"v": {
"name": "a",
"v": {
"name": "b",
"v": {
"name": "a",
"v": {
"name": "b",
"v": {
"name": "a",
"v": {
"name": "b",
"v": {
...永远
JSON 没有处理这个问题的标准方法。您可以通过显式键间接引用来解决它:
{
"key1": {
"name": "a",
"v_key" : "key2"
},
"key2": {
"name": "b",
"v_key": "key1"
}
}
在 Java 中,这可以通过以下方式实现:
Map<String,Object> map = new HashMap<String,Object>();
A a = new A();
a.name = "a";
map.add("a", a);
B b = new B();
b.name = "b";
map.add("b", b);
a.v_key = "b";
b.v_key = "a";
您还没有告诉我们您正在使用什么 JSON 库。它可能具有使用与上述类似的方法自动处理循环依赖性的方法。在其文档中搜索单词 "cyclic"。
(对于杰克逊,请参阅:Infinite Recursion with Jackson JSON and Hibernate JPA issue)