[Spring Boot] JacksonでLocalDateをjson <-> オブジェクトに変換
Jackson で Java8 以降に追加された LocalDate 型のフィールドを持つオブジェクトと json を変換する際の、シリアライズ・デシリアライズの方法。
Contents
現象
SpringBoot で RestController を使うと、 json とオブジェクトは Jackson を使って変換される。
オブジェクトに Java8 以降に追加された LocalDate 型のフィールドを持つ場合、何もしないで json 変換すると以下のようになる。
LocalDate 型のフィールドを持つオブジェクト
変換処理
オブジェクト -> json 変換
LocalDate 型を json に変換すると chronology とかたくさんの情報が付与される。
{"date":{
"year":2021,
"month":"JULY",
"era":"CE",
"dayOfYear":199,
"dayOfWeek":"SUNDAY",
"leapYear":false,
"monthValue":7,
"dayOfMonth":18,
"chronology":{"id":"ISO","calendarType":"iso8601"}
}}
json ->オブジェクト 変換
エラー発生
com.fasterxml.jackson.databind.exc.InvalidDefinitionException:
Cannot construct instance of `java.time.LocalDate` (no Creators, like default constructor, exist): no String-argument constructor/factory method to deserialize from String value ('2020-09-19')
対応
オブジェクト -> json 変換
シリアライズしてくれるアノテーションと、フォーマットしてくれるアノテーションを付与する。
json ->オブジェクト 変換
デシリアライズしてくれるアノテーションを付与する。
LocalDate 型のフィールドを持つオブジェクトにアノテーション付与
JsonSerialize
と JsonDeserialize
アノテーションには、com.fasterxml.jackson.datatype
が持つ LocalDateSerializer
クラスと LocalDateDeserializer
クラスを使っているが、カスタムのシリアライザー、デシリアライザークラスを作って使うこともできる。
13. Custom Date Deserializer
ZonedDateTime
型の変換は下記に記載。