我有一对像
public class Obj1 {
public int id;
public String name;
public Obj2 obj2;
}
public class Obj2 {
public int id;
public String name;
public List<Obj1> obj1list;
}
我希望能够通过Jackson将其转换为Json。我找到了JsonManagedReference
和JsonBackReference
并给它们加上了注释,但是当您这样做时,序列化仅以一种方式起作用。仅当序列JsonManagedReference
的类被序列化时才会显示。
如果我序列化一个“ Obj1”,我想查看附加到它的“ Obj2”。如果我序列化“ Obj2”,我想查看附加到它的“ Obj1”列表。
我也尝试过像这样使用JsonIdentityInfo批注
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
这似乎可行,除了它将父对象的“ id”值添加到子对象(或列表中的每个子对象)中,这有点奇怪。虽然我想我可以忍受。
有没有一种方法可以使它表现出预期的效果?
答案 0 :(得分:5)
您正在查看@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<Obj1> obj1list;
}
更新
我总是将@JsonIgnoreProperties
胜过JsonBackReference
和JsonManagedReference
。不仅可以达到目的,而且还不能避免任何数据序列化(在这里就是这种情况)。
我在github上有一个示例项目可以解决这种情况。查找实体类代码School.java
和District.java
。如果您想运行测试,则其为mvn spring-boot可执行代码。
从Javadoc开始,从Jackson 2.0开始,
@JsonIgnoreProperties
注释可以应用于类和属性。如果将两者同时使用,则实际集合将是所有无义对象的并集:也就是说,您只能添加要忽略的属性,而不能删除或覆盖。因此,您不能删除按属性注释要忽略的属性。
工作原理
当您在属性级别定义@JsonIgnoreProperties
时,在进行序列化/反序列化时,它将在所引用的属性对象上工作。
所以在这里,当解析Obj1
时,您要求解析器忽略obj1list
的{{1}}属性。同样,在解析obj2
时,它将忽略Obj2
集合中包含的obj2
引用。因此您的解析如下所示:
Obj