@JsonIgnore和@JsonBackReference,@ JsonManagedReference之间的区别

时间:2016-05-23 13:45:59

标签: java json jackson

我知道@JsonIgnore@JsonManagedReference@JsonBackReference用于解决Infinite recursion (StackOverflowError),这两者之间有什么区别?

注意: 这些是杰克逊的注释。

2 个答案:

答案 0 :(得分:44)

假设我们有

private class Player {
    public int id;
    public Info info;
}
private class Info {
    public int id;
    public Player parentPlayer;
}

// something like this:
Player player = new Player(1);
player.info = new Info(1, player);

序列化

@JsonIgnore

private class Info {
    public int id;
    @JsonIgnore
    public Player parentPlayer;
}

@JsonManagedReference + @JsonBackReference

private class Player {
    public int id;
    @JsonManagedReference
    public Info info;
}

private class Info {
    public int id;
    @JsonBackReference
    public Player parentPlayer;
}

将产生相同的输出。上面的演示案例的输出是:{"id":1,"info":{"id":1}}

反序列化

这是主要区别,因为使用@JsonIgnore进行反序列化 只会将null设置为该字段,因此在我们的示例中,parentPlayer将为== null。

enter image description here

但是@JsonManagedReference + @JsonBackReference我们会在那里得到Info的回复

enter image description here

答案 1 :(得分:29)

  

用于解决无限递归(StackOverflowError)

@JsonIgnore并非旨在解决 Infinite Recursion 问题,它只是忽略了被注释的属性被序列化或反序列化。但是如果字段之间存在双向链接,由于@JsonIgnore忽略了带注释的属性,您可以避免无限递归。

另一方面,@JsonManagedReference@JsonBackReference旨在处理字段之间的双向链接,一个用于 Parent 角色,另一个用于 Child 角色分别为:

  

为了避免这个问题,处理链接以使属性成为可能   带有@JsonManagedReference注释的注释正常处理   (通常序列化,没有特殊的反序列化处理)和   用@JsonBackReference注释注释的属性不是   系列化;在反序列化期间,其值设置为实例   有#34;托管" (转发)链接。

总结一下,如果您在序列化或反序列化过程中不需要这些属性,则可以使用@JsonIgnore。否则,使用@JsonManagedReference / @JsonBackReference对是可行的方法。