web-dev-qa-db-ja.com

ジャクソン-双方向の関係を持つエンティティのシリアル化(サイクルの回避)

2つのエンティティがあります。

Parent {
   Child[] children;
}

and 

Child {
   Parent parent;
}

私は@JsonBackReferenceおよび@JsonManagedReferenceParentのインスタンスをシリアル化する場合、それらは優れています。

しかし、Childのインスタンスも転送する必要があり、parentフィールドに値を設定したいです。

言い換えると:

  1. Parentのシリアル化では、childrenを持つ必要がありますが、その親フィールドは空の場合があります(json参照アノテーションを使用して解決できます)。
  2. Childのシリアル化では、parentを含むchildrenが必要です(ただし、childrenparentを設定する必要はありません。

標準のジャクソン機能を使用してそれを解決する方法はありますか?

つまりフィールドをシリアル化の対象または非対象としてマークする代わりに、既にシリアル化されたエンティティのシリアル化をスキップします。

43
Eugene Retunsky

Jackson 2.0は、完全な循環オブジェクト参照をサポートします。例については、「 Jackson 2.0リリース 」(「任意のオブジェクトグラフの処理、周期的なグラフでも!」)を参照してください。

基本的に、id/idrefスタイルの処理を必要とする型には、新しい@JsonIdentityInfoを使用する必要があります。あなたの場合、これはParent型とChild型の両方になります(一方がもう一方を拡張する場合は、スーパー型に追加するだけで十分です)。

40
StaxMan

非常に便利なインターフェイス実装は、jackson 2ライブラリで次のように提供されます。

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

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

メイヴンで

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

@StaxManは、開始するための素敵なリンクを提供しました

21