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
クラスレベルまたはメソッドレベルの注釈。