【问题标题】:Jackson - serialization of entities with birectional relationships (avoiding cycles)Jackson - 具有双向关系的实体序列化(避免循环)
【发布时间】:2012-04-21 08:11:58
【问题描述】:

我有两个实体:

Parent {
   Child[] children;
}

and 

Child {
   Parent parent;
}

我知道@JsonBackReference@JsonManagedReference。 它们很好,如果我要序列化 ​​Parent 的实例。

但我还需要传输Child 的实例,并且我希望填充parent 字段。

换句话说:

  1. 在序列化Parent 时,它应该有children,但它们的父字段可能为空(可以通过使用json 引用注释来解决)。
  2. 在序列化Child 时,它应该有parent 和它们的children(但children 不必填充parent

有没有办法使用标准的杰克逊功能来解决这个问题?

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

【问题讨论】:

    标签: java json jackson cycle bidirectional-relation


    【解决方案1】:

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

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

    【讨论】:

    • 相当新鲜的版本。需要一些包裹移动。好的,我去看看。
    • 是的,是的,大升级。但功能本身也很大。 :-)
    • 如何在 JavaScript 中使用 JSON2 反序列化?
    • 对不起——Jackson 2.0 只是库的版本;结果只是普通的 JSON。但至于如何解析引用,为此您需要一个匹配的 javascript 库:JSON 格式没有任何东西可以显式帮助解析 deps。
    • 我也有类似的问题,但在尝试此解决方案后没有运气:stackoverflow.com/q/36809325/3300911
    【解决方案2】:

    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 提供了一个不错的开始链接

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 2015-02-13
    相关资源
    最近更新 更多