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那里得到报复
Ali*_*ani 33
用于解决无限递归(StackOverflowError)
@JsonIgnore不是为解决无限递归问题而设计的,它只是忽略了被序列化或反序列化的带注释属性.但是如果字段之间存在双向链接,则@JsonIgnore忽略带注释的属性,可以避免无限递归.
在另一方面,@JsonManagedReference和@JsonBackReference旨在处理领域,一为之间的这种双向联动家长的作用,另外对于儿童分别作用:
为了避免这个问题,处理链接使得注释带
@JsonManagedReference注释的属性得到正常处理(正常序列化,没有特殊的反序列化处理),注释@JsonBackReference注释的属性不是序列化的; 在反序列化期间,其值设置为具有"托管"(转发)链接的实例.
回顾一下,如果在序列化或反序列化过程中不需要这些属性,则可以使用@JsonIgnore.否则,使用@JsonManagedReference/ @JsonBackReferencepair是要走的路.
| 归档时间: |
|
| 查看次数: |
31979 次 |
| 最近记录: |