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

Kal*_*han 41 java json jackson

我知道这两个@JsonIgnore@JsonManagedReference,@JsonBackReference用于解决Infinite recursion (StackOverflowError),就是这两者之间的区别?

注意: 这些是杰克逊注释.

var*_*ren 53

让我们假设我们有

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);
Run Code Online (Sandbox Code Playgroud)

序列化

@JsonIgnore

private class Info {
    public int id;
    @JsonIgnore
    public Player parentPlayer;
}
Run Code Online (Sandbox Code Playgroud)

@JsonManagedReference+@JsonBackReference

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

private class Info {
    public int id;
    @JsonBackReference
    public Player parentPlayer;
}
Run Code Online (Sandbox Code Playgroud)

将产生相同的输出.和输出用于演示的情况下,从上面的是:{"id":1,"info":{"id":1}}

反序列化

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

在此输入图像描述

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

在此输入图像描述

  • 非常感谢,它清除了我心中的许多怀疑.我试图搜索这种特殊类型的序列化,它不会破坏或忽略序列化的任何一方 (3认同)

Ali*_*ani 33

用于解决无限递归(StackOverflowError)

@JsonIgnore不是为解决无限递归问题而设计的,它只是忽略了被序列化或反序列化的带注释属性.但是如果字段之间存在双向链接,则@JsonIgnore忽略带注释的属性,可以避免无限递归.

在另一方面,@JsonManagedReference@JsonBackReference旨在处理领域,一为之间的这种双向联动家长的作用,另外对于儿童分别作用:

为了避免这个问题,处理链接使得注释带@JsonManagedReference注释的属性得到正常处理(正常序列化,没有特殊的反序列化处理),注释@JsonBackReference注释的属性不是序列化的; 在反序列化期间,其值设置为具有"托管"(转发)链接的实例.

回顾一下,如果在序列化或反序列化过程中不需要这些属性,则可以使用@JsonIgnore.否则,使用@JsonManagedReference/ @JsonBackReferencepair是要走的路.

  • 谢谢阿里,这有助于我找出忽略,序列化和反序列化之间的真正区别.非常感谢 (2认同)