35

pojo オブジェクトをJSON表現にシリアル化するために、Jackson ライブラリを使用しています。たとえば、クラス A とクラス B があります。

class A {
  private int id;
  private B b;

  constructors...
  getters and setters
}

class B {
  private int ind;
  private A a;

  constructors...
  getters and setters
}

クラスAからオブジェクトをシリアライズしたい場合、シリアライズ中に再帰が発生する可能性があります。を使用して停止できることを知ってい@JsonIgnoreます。

depth-level でシリアル化を制限することは可能ですか?

たとえば、レベルが 2 の場合、シリアル化は次のようになります。

  • シリアル化 a、レベル = 0 (0 < 2 OK) - > シリアル化
  • ab をシリアライズ、レベル =1 (1 < 2 OK) -> シリアライズ
  • aba をシリアライズ、レベル = 2 (2 < 2 ではない) -> 停止

前もって感謝します。

4

7 に答える 7

26

私は最近、同様の問題に遭遇しました: ジャクソン -二項関係を持つエンティティのシリアル化(サイクルの回避)

したがって、解決策は、Jackson 2.0 にアップグレードし、クラスに次の注釈を追加することです。

@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, 
                  property = "@id")
public class SomeEntityClass ...

これは完全に機能します。

于 2012-04-17T22:38:52.130 に答える
13

次のリンクを確認してください。役立つ場合があります。

その後の唯一のオプションは、オブジェクト タイプのシリアライゼーション/デシリアライゼーション用に独自のカスタム モジュールを作成することです。ここを参照してください:

よろしく。

于 2012-04-17T16:54:49.790 に答える
4

レベルベースの無視はサポートされていません。

しかし、Jackson に 2.0 で循環参照を処理させることができます。使用方法の説明については、たとえば「 Jackson 2.0 リリース@JsonIdentityInfo」を参照してください。

于 2012-04-17T22:36:14.853 に答える
3

1 つのレベルだけに制限したい場合 (つまり、現在のオブジェクトの子に移動し、それ以上移動しない場合)、@JsonView を使用した簡単な解決策があります。

別のオブジェクトへのリンクであるすべてのフィールドで、ビューとして現在のクラスで注釈を付けます。

class A {
  private int id;
  @JsonView(A.class) private B b;

  constructors...
  getters and setters
}

class B {
  private int ind;
  @JsonView(B.class) private A a;

  constructors...
  getters and setters
}

次に、シリアル化するときに、オブジェクト クラスをビューとして使用します。A のインスタンスをシリアライズすると、次のようになります。

{
  id: 42,
  b: {
    id: 813
  }
}

DEFAULT_VIEW_INCLUSION が true に設定されていることを確認してください。そうしないと、@JsonView アノテーションのないフィールドはレンダリングされません。または、 Object クラスまたは一般的なスーパークラスを使用して、 @JsonView で他のすべてのフィールドに注釈を付けることができます。

class A {
  @JsonView(Object.class) private int id;
  @JsonView(A.class) private B b;

  constructors...
  getters and setters
}
于 2015-07-02T09:06:55.307 に答える
2

深度ごとのシリアル化については、こちらの例を参照できますhttps://github.com/abid-khan/depth-wise-json-serializer

于 2014-08-25T09:54:26.007 に答える
0

場合によっては、最大深度を保持するスレッド ローカル整数を使用してシリアライゼーションの深度を制限できます。この回答を参照してください。

于 2014-02-14T21:20:41.483 に答える