Jackson json双向对象参考

我有一对像

public class Obj1 { public int id; public String name; public Obj2 obj2; } public class Obj2 { public int id; public String name; public List obj1list; } 

我希望能够通过Jackson将其转换为Json。 我找到了JsonManagedReferenceJsonBackReference并对它们进行了注释,但是当你这样做时,序列化只能以一种方式工作。 它仅在具有JsonManagedReference端的类被序列化时显示。

如果我序列化“Obj1”,我想看到附加到它的“Obj2”。 如果我序列化“Obj2”,我想看到附加到它的“Obj1”列表。

我也尝试过像这样使用JsonIdentityInfo注释

 @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id") 

这似乎有效,除了它将父对象的“id”值添加到子对象(或列表中的每个子对象)中,这有点奇怪。 虽然我想我可以忍受它。

有没有办法让这个表现得像我期望的那样?

您正在查看@JsonIgnoreProperties ,它将提供所需内容并避免json递归。

 public class Obj1 { public int id; public String name; @JsonIgnoreProperties("obj1list") public Obj2 obj2; } public class Obj2 { public int id; public String name; @JsonIgnoreProperties("obj2") public List obj1list; } 

UPDATE

我总是在JsonBackReferenceJsonManagedReference 。 因为它不仅可以解决问题,而且还不会逃避任何数据序列化(这是必需的)。

我还有一个关于github的示例项目处理这种情况。 查找实体类代码School.javaDistrict.java 。 如果你想进行测试,它是一个mvn spring-boot可执行代码。

从Javadoc开始,从Jackson 2.0开始, @JsonIgnoreProperties注释可以应用于类和属性。 如果两者都使用,则实际集合将是所有忽略的并集:即,您只能添加要忽略的属性,而不是删除或覆盖。 因此,您无法使用每个属性注释删除要忽略的属性。

怎么运行的

@JsonIgnoreProperties级别定义@JsonIgnoreProperties时,在序列化/去除化时,它将对引用的属性对象起作用。

所以在这里,当解析Obj1时,你要求解析器忽略obj2 obj1list属性。 Obj2 ,在解析Obj2 ,它将忽略Obj集合中包含的obj2引用。 所以你的解析将如下所示:

 Obj1 : { id : int, name : string, Obj2 : { id : int, name : string obj1list : //ignored avoids recursion } } Obj2 : { id : int, name : string, obj1list : [{ id : int, name : string, obj2 : //ignored avoids recursion }, { id : int, name : string obj2 : //ignored avoids recursion } ] }