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に依存したバージョンです
- 2.13.4
ゴール
デフォルトだと左で出力されるので、右で出力できればゴールです。

対応
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等々は文字列化(シリアライズ)ができません。今回は、LocalDateTimeをyyyy/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);
ソースコード
私が動作確認したときのテストコードは残しますので、詳しい処理はソースで確認してください。
- https://github.com/hirotoKirimaru/cucumber-sample/blob/f901a9bb1136d129d1d41a27173f1e504055fab7/kirimaru-core/src/main/java/kirimaru/helper/Debugs.java#L22
- https://github.com/hirotoKirimaru/cucumber-sample/blob/f901a9bb1136d129d1d41a27173f1e504055fab7/kirimaru-core/src/test/java/kirimaru/helper/DebugsTest.java#L18
備考
ToStringのアノテーションで特定の項目を除外する方法は、私の過去記事を参考にしてください。
実行時の条件によって変更する方法は見つかりませんでした。
終わりに
今回の処理は、過去の自分のブログに助けられました。
もう少しカスタマイズしたい場合は、Jacksonライブラリの使い方を検索すればよいです。私は最低限ここまで知れればデバッグメッセージとしては十分ですので、もっと深く知りたい方は別の方の記事を参考にしてください。
類似情報
- REST APIのレスポンスJSONでデータが無い時の表現 - きり丸の技術日記
- JavaでJSONを比較する(特定の項目を無視するやり方) - きり丸の技術日記
- JavaのJacksonライブラリのCsvMapperでCSVを読み込む - きり丸の技術日記
- LombokでToString.IncludeとExclude、callSuperで便利にログ出力する - きり丸の技術日記