杰克逊json双向对象引用

时间:2018-06-21 19:35:31

标签: java jackson

我有一对像

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。我找到了JsonManagedReferenceJsonBackReference并给它们加上了注释,但是当您这样做时,序列化仅以一种方式起作用。仅当序列JsonManagedReference的类被序列化时才会显示。

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

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

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

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

有没有一种方法可以使它表现出预期的效果?

1 个答案:

答案 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胜过JsonBackReferenceJsonManagedReference。不仅可以达到目的,而且还不能避免任何数据序列化(在这里就是这种情况)。

我在github上有一个示例项目可以解决这种情况。查找实体类代码School.javaDistrict.java。如果您想运行测试,则其为mvn spring-boot可执行代码。

  

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


工作原理

当您在属性级别定义@JsonIgnoreProperties时,在进行序列化/反序列化时,它将在所引用的属性对象上工作。

所以在这里,当解析Obj1时,您要求解析器忽略obj1list的{​​{1}}属性。同样,在解析obj2时,它将忽略Obj2集合中包含的obj2引用。因此您的解析如下所示:

Obj