当前位置: 首页 > 知识库问答 >
问题:

@JsonIgnore和@JsonBackReference、@JsonManagedReference的区别

万俟震博
2023-03-14

我知道@JsonIgnore@JsonManagedApplication@JsonBackReference都是用来解决无限递归(StackOverflow Error)的,这两个有什么区别?

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

共有2个答案

厍书
2023-03-14

用于解决无限递归(堆栈溢出错误)

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

另一方面,< code > @ jsonmanagedrereference 和< code>@JsonBackReference用于处理字段之间的双向链接,一个用于父角色,另一个用于子角色:

为了避免这个问题,对链接进行了处理,以使用@JsonManagedReference注释注释的属性得到正常处理(正常序列化,没有反序列化的特殊处理),而用@JonBackReference注解注释的属性没有被序列化;在反序列化期间,其值被设置为具有“托管”(转发)链接的实例。

概括地说,如果在序列化或反序列化过程中不需要这些属性,可以使用< code>@JsonIgnore。否则,可以使用< code > @ JsonManagedReference /< code > @ JsonBackReference 对。

伍昱
2023-03-14

假设我们有

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上。 感谢任何建议。多谢了。