Java と Spring Boot の Jackson で Null フィールドを無視する

Null 値は、ソフトウェア開発、および適切な処理で多く発生します。 null 価値観は、それ自体が科学に変わる可能性があります。 Jackson は、Java オブジェクトのシリアライズとデシリアライズのためのデファクト ライブラリです。 null フィールド.

この短いチュートリアルでは、Jackson で POJO をシリアル化するときに null フィールドを無視する方法を見ていきます。

ObjectMapper 設定の変更

Jackson の ObjectMapper は、オブジェクトをシリアライズされた値にマップする中心的な API です。 当然のことながら、さまざまなフラグを使用して動作を調整およびカスタマイズできます。その XNUMX つが次のとおりです。

objectMapper.setSerializationInclusion(Include.NON_NULL);

このマッパーでシリアル化する場合、プロパティが null でない場合にのみ含まれます。

これにより、フラグが設定されます グローバルに でシリアル化されているオブジェクトに対して objectMapper 実例。 Spring Boot を使用していて、Spring Boot が依存している ObjectMapper が公開されていない場合は、 application.properties ファイル:

spring.jackson.default-property-inclusion = non_null

または、使用している場合 application.yml:

spring:
  jackson:
    default-property-inclusion: non_null

注: 古いバージョンの Spring を使用 spring.jackson.serialization-inclusion=non_null spring.jackson.default-property-inclusion=non_null.

または、デフォルトをピールバックで置き換えることもできます ObjectMapper 新規登録によるインスタンス @Primary @Bean、名前付き objectMapper()これは、デフォルトの実装をオーバーライドし、シリアライズおよびデシリアライズ時にデフォルトで使用されるインスタンスを完全にカスタマイズできます。

@Bean
@Primary
public ObjectMapper objectMapper() {
    return new ObjectMapper()
      .setSerializationInclusion(JsonInclude.Include.NON_NULL);
}

この @Bean 入る必要があります 任意のファイル と注釈が付けられています @Configuration 注釈であり、多くの場合、Spring Boot アプリケーションの特殊な構成クラスまたはメイン クラスのいずれかに配置されます。

Jackson2ObjectMapperBuilder インスタンスの変更

春は使用します HttpMessageConverters HTTP メッセージとオブジェクトの間で変換します。 デフォルトのコンバーターは ObjectMapper および XmlMapper 経由でインスタンス化されたインスタンス Jackson2ObjectMapperBuilder.

手動でプライマリを提供する代わりに ObjectMapper (ビルダーが提供するものを置き換えます)、Springに指示できます 構築する方法 代わりにオブジェクトマッパー。 これにより、Spring は、動作方法をカスタマイズしながら、低レベルのオブジェクトを改ざんすることなく高レベルの構成を行うことができます。 さらに、カスタマイズすることもできます XmlMapper 一気にここまで。

ビルダーをカスタマイズするには、新しい @Bean of Jackson2ObjectMapperBuilderCustomizer ビルダーをカスタマイズして返します。

@Bean
public Jackson2ObjectMapperBuilderCustomizer customBuilder() {
    return builder -> {
      builder.serializationInclusion(JsonInclude.Include.NON_NULL);
    }
}

@JsonInclude アノテーション

スペクトルの反対側では、ローコードの代替手段としてアノテーションを使用できます! 注釈は、クラス レベルまたはメソッド レベルで適用できます。

@JsonInclude(JsonInclude.Include.NON_NULL)

これにより、オブジェクト マッパーのグローバルな動作ではなく、特定のクラスのみをカスタマイズできます。

ベストプラクティス、業界で認められた標準、および含まれているチートシートを含む、Gitを学習するための実践的で実用的なガイドを確認してください。 グーグルGitコマンドを停止し、実際に 学ぶ それ!

注: Jackson 2.0 の時点で、注釈の値は JsonInclude.Include.NON_NULL. 以前のバージョンの場合は、 include=JsonSerialize.Inclusion.NON_NULL.

クラスレベルの @JsonInclude

申し込むとき @JsonInclude クラス レベルでは、注釈はすべてのゲッターとセッターに拡張されます。

@Entity(name="property")
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Property implements Serializable {
    private static final long serialVersionUID = 1L;
    
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private String id;

    @Column(name="transaction_type")
    private TransactionType transactionType;

    @Column(name="property_type")
    private PropertyType propertyType;
    
    
}

ある特定のフィールド null 値はシリアル化されません。

メソッドレベルの @JsonInclude

または、最も詳細なオプションとして、メソッド レベルでアノテーションを適用できます。

@Entity(name="property")
public class Property implements Serializable {
    private static final long serialVersionUID = 1L;
    
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private String id;

    @Column(name="transaction_type")
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private TransactionType transactionType;

    @Column(name="property_type")
    private PropertyType propertyType;
    
    
}

このスニペットでは、アノテーションは TransactionType フィールド。

まとめ

このガイドでは、Java と Spring Boot を使用して、Jackson で null フィールドを無視する方法を学びました。 これは、基になる暗黙的なものを置き換えることでグローバルに実現できます ObjectMapper インスタンスを作成し、登録する新しいプライマリ Bean の動作をカスタマイズします。

または、カスタマイズすることもできます Jackson2ObjectMapperBuilder それは ObjectMapper 既に構築されたものを置き換えるのではなく、アプリケーション用に。 ローコード ソリューションの場合 – を変更できます spring.jackson.default-property-inclusion プロパティ ファイルのプロパティ。

最後に – を使用できます @JsonInclude クラスレベルまたはメソッドレベルの注釈。

タイムスタンプ:

より多くの スタックアバス