きり丸の技術日記

技術検証したり、資格等をここに残していきます。

Javaでデバッグ用にnullは出力しないToStringのようなメッセージを出力したい(JSON, Object Mapper, JsonInclude.Include.NON_NULL)

タイトルではToStringを加工するような書き方をしていますが、処理イメージを伝えるものですのでToStringは使用しません。

デバッグのためにLombokで大量のフィールドをもつクラスをToStringで出力すると、当然大きな文字列となります。基本的には全フィールドを出力する方がよいのですが、場合によっては不要なフィールドを除いたメッセージの方が読みやすいです。

今回の記事では、値がnullの項目を除去したデバッグメッセージを出力する方法を記載します。なお、最終的には比較が目的のため、今回はJSON形式での出力をゴールとします。

環境

  • Java
    • 17
  • com.fasterxml.jackson.core
    • 2.13.4
      • ※ SpringBootに依存したバージョンです

ゴール

デフォルトだと左で出力されるので、右で出力できればゴールです。

対応

JSON形式で出力するため、ObjectMapperを使用します。ObjectMapper#setSerializationInclusionでnullの扱いを設定できるので、今回はnullを表示しないためにJsonInclude.Include.NON_NULLを渡してください。後は、ObjectMapper#writeValueAsStringにデバッグメッセージを出力したいインスタンスを渡すことで、JSON形式で出力されます。

public static String debugJson(Object object) {
  ObjectMapper om = new ObjectMapper();
  om.setSerializationInclusion(JsonInclude.Include.NON_NULL);
  return om.writeValueAsString(object);
}

LocalDateTimeを文字列化したい

デフォルト設定のままだと、LocalDate, LocalDateTime等々は文字列化(シリアライズ)ができません。今回は、LocalDateTimeyyyy/MM/dd hh:mm:ssで出力する設定を記載します。

JavaTimeModule javaTimeModule = new JavaTimeModule();
javaTimeModule.addSerializer(
    LocalDateTime.class,
    new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy/MM/dd hh:mm:ss"))
);
om.registerModule(javaTimeModule);

アノテーションで特定の項目は無視したい

プロダクトコードを修正していいのであれば、対象のフィールドに対してJsonIgnoreを付与すると出力しなくなります。

@JsonIgnore
private String ignore;

フィルタで特定の項目は無視したい

フィルタを設定することで、不必要な項目を出力しないようにできます。

SimpleBeanPropertyFilter theFilter = SimpleBeanPropertyFilter
    .serializeAllExcept("id", "ignore"); // 無視したい項目
FilterProvider filters = new SimpleFilterProvider()
    .addFilter("myFilter", theFilter); // 特に意味がない?
om.writer(filters).writeValueAsString(object);

ソースコード

私が動作確認したときのテストコードは残しますので、詳しい処理はソースで確認してください。

備考

ToStringのアノテーションで特定の項目を除外する方法は、私の過去記事を参考にしてください。

実行時の条件によって変更する方法は見つかりませんでした。

終わりに

今回の処理は、過去の自分のブログに助けられました。

  1. Spring の REST APIでnullの際にkeyごと落とす設定があったはず
  2. JSON比較のテスト方法忘れた
  3. LocalDate等はシリアライズできなかったはず

もう少しカスタマイズしたい場合は、Jacksonライブラリの使い方を検索すればよいです。私は最低限ここまで知れればデバッグメッセージとしては十分ですので、もっと深く知りたい方は別の方の記事を参考にしてください。

類似情報

参考情報