我知道@JsonIgnore
和@JsonManagedApplication
,@JsonBackReference
都是用来解决无限递归(StackOverflow Error)
的,这两个有什么区别?
注意:这些是杰克逊的注释。
用于解决无限递归(堆栈溢出错误)
@JsonIgnore
不是为了解决无限递归问题而设计的,它只是在序列化或反序列化时忽略带注释的属性。但如果字段之间存在双向链接,因为@JsonIgnore
忽略带注释的属性,则可以避免无限递归。
另一方面,< code > @ jsonmanagedrereference 和< code>@JsonBackReference用于处理字段之间的双向链接,一个用于父角色,另一个用于子角色:
为了避免这个问题,对链接进行了处理,以使用@JsonManagedReference
注释注释的属性得到正常处理(正常序列化,没有反序列化的特殊处理),而用@JonBackReference
注解注释的属性没有被序列化;在反序列化期间,其值被设置为具有“托管”(转发)链接的实例。
概括地说,如果在序列化或反序列化过程中不需要这些属性,可以使用< code>@JsonIgnore。否则,可以使用< code > @ JsonManagedReference /< code > @ JsonBackReference 对。
假设我们有
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;
}
和@JsonManagedRepository
@JsonBackRepository
private class Player {
public int id;
@JsonManagedReference
public Info info;
}
private class Info {
public int id;
@JsonBackReference
public Player parentPlayer;
}
将产生相同的输出。上面的演示案例的输出是:< code>{"id":1," info":{"id":1}}
这是主要区别,因为使用@JsonIgnore
的反序列化只会将 null 设置为字段,因此在我们的示例中,parentPlayer 将为 == null。
但是,通过@JsonManagedReference
@JsonBackReference
,我们将在那里获得信息
参考
问题内容: 我想知道的区别,并在杰克逊? 问题答案: @JsonManagedReference是引用的前一部分-可以正常序列化的部分。@JsonBackReference是参考的后半部分–序列化将忽略它。 所以他们真的取决于你的关系方向
我想知道Jackson中和之间的区别?
我正在使用RestEasy、Jboss 7和EJB 3.1。我正在创建一个以JSON格式返回数据的RESTful Web服务。 问题是我在一个实体上有一个关系,这会在序列化期间导致无限递归。我尝试使用Jackson的和annotation来解决这个问题,但似乎它们被完全忽略了,无限递归仍在发生。 这是我的用户类: 这是我角色课的一部分: 我在某处读到过,我应该用我的应用程序注册Jackson,以便
问题内容: 我试图根据我从关联存储库引用的实体,找到一种交换@JsonBackRefence和@JsonManagedReference的方法。 Site.java Building.java SiteRepository.java BuildingRepository.java 但是,当调用findById(buildingId)时,我想交换@JsonBackReference。因此,@ Jso
在处理一个项目时,我犯了一个错误,将@jsonIgnore放在setter而不是getter属性上,如下所示 这是@jsonIgnore正常工作的方式吗?我以为只在getter上设置@jsonignore可以防止序列化。在这里,它阻止了序列化,即使我把它放在getter或setter上。 感谢任何建议。多谢了。