web-dev-qa-db-ja.com

ジャクソンチェンジJsonIgnore Dynamically

クラスがあり、その中にも変数があります。場合によっては、一部のフィールドを無視したいこともありますが、逆シリアル化するときは無視しない場合もあります(シリアル化時も)。ジャクソンでどうすればいいですか?

29
kamaci

シリアル化については、 " filtering properties "ブログエントリが役立ちます。書き込まれたものを除外することが一般的であるため、逆シリアル化側のサポートが少なくなります。

可能なアプローチの1つは、JacksonAnnotationIntrospectorをサブクラス化し、メソッド(および/またはフィールド)の無視可能性をイントロスペクトするメソッドをオーバーライドして、必要なロジックを使用することです。

また、実用的なアプリケーションの例、つまり、デシリアライズされないようにしようとしているものと理由を示した場合にも役立ちます。

22
StaxMan

JsonViewsを使用したい場合があります(元々は http://wiki.fasterxml.com/JacksonJsonViews -壊れました-ウェブアーカイブリンク: https://web.archive.org /web/20170831135842/http://wiki.fasterxml.com/JacksonJsonViews

引用:

まず、ビューを定義することはクラスを宣言することを意味します。既存のクラスを再利用するか、偽のクラスを作成することができます。これらは関係情報を持つビュー識別子にすぎません(子は親からビューメンバーシップを継承します)。

 // View definitions:
  class Views {
            static class Public { }
            static class ExtendedPublic extends PublicView { }
            static class Internal extends ExtendedPublicView { }
  }

  public class Bean {
            // Name is public
            @JsonView(Views.Public.class) String name;
            // Address semi-public
            @JsonView(Views.ExtendPublic.class) Address address;
            // SSN only for internal usage
            @JsonView(Views.Internal.class) SocialSecNumber ssn;
  }

このようなビュー定義では、シリアル化は次のように行われます。

 // short-cut:
  objectMapper.writeValueUsingView(out, beanInstance, ViewsPublic.class);

  // or fully exploded:
  objectMapper.getSerializationConfig().setSerializationView(Views.Public.class);
  // (note: can also pre-construct config object with 'mapper.copySerializationConfig'; reuse)
  objectMapper.writeValue(out, beanInstance); // will use active view set via Config

  // or, starting with 1.5, more convenient (ObjectWriter is reusable too)
  objectMapper.viewWriter(ViewsPublic.class).writeValue(out, beanInstance);
and result would only contain 'name', not 'address' or 'ssn'.
1
João Antunes

おそらく、最近のJacksonバージョンの モジュール機能 を見る必要があります。

可能なメカニズムの1つは、 BeanDeserializerModifier を使用することです。

便利なオンラインチュートリアルまたはサンプルを探していましたが、すぐには表示されません。コンテキストがさらにわかっている場合は、何かを処理できる可能性があります。 ObjectMappersを手動で管理していますか、それともJAX-RS設定で使用しているか、Springで注入していますか?

0
ptomli