杰克逊 - 具有双向关系的实体的序列化(避免周期)

时间:2012-04-08 17:54:39

标签: java json jackson cycle bidirectional-relation

我有两个实体:

Parent {
   Child[] children;
}

and 

Child {
   Parent parent;
}

我知道@JsonBackReference@JsonManagedReference。 如果我正在序列化Parent的实例,那么它们很好。

但我还需要转移Child的实例,并希望填充parent字段。

换句话说:

  1. 关于Parent的序列化,它应该有children但是它们的父字段可能是空的(可以通过使用json引用注释来解决)。
  2. Child序列化时,parent应该children children,但parent不必填充{{1}}。
  3. 有没有办法使用标准的Jackson功能来解决它​​?

    即。跳过已经序列化的实体的序列化,而不是标记符合条件或不符合序列化条件的字段。

2 个答案:

答案 0 :(得分:38)

Jackson 2.0确实支持完整的循环对象引用。有关示例,请参阅“Jackson 2.0 released”(“处理任何对象图,甚至是循环图!”部分)。

基本上,对于需要id / idref样式处理的类型,您需要使用新的@JsonIdentityInfo。在你的情况下,这将是ParentChild类型(如果一个扩展另一个,只需将它添加到超类型,这很好)。

答案 1 :(得分:21)

非常方便的接口实现在jackson 2库中提供

@Entity
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
public class Parent { ....

@Entity
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
public class Child { ....

在maven中

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.0.2</version>
</dependency>

@StaxMan提供了一个从

开始的好链接