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。 我找到了JsonManagedReference
和JsonBackReference
并对它们进行了注释,但是当你这样做时,序列化只能以一种方式工作。 它仅在具有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
我总是在JsonBackReference
和JsonManagedReference
。 因为它不仅可以解决问题,而且还不会逃避任何数据序列化(这是必需的)。
我还有一个关于github的示例项目处理这种情况。 查找实体类代码School.java
和District.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 } ] }