[SpringBoot] Jackson で ZonedDateTime を json <-> オブジェクトに変換
ZonedDateTime 型のフィールドを持つオブジェクトの、シリアライズ・デシリアライズの方法。
ZonedDateTime
型のフィールドを持つオブジェクト
@Data
public class User {
@JsonDeserialize(using = ZonedDateTimeDeserializer.class)
@JsonSerialize(using = ZonedDateTimeSerializer.class)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss z")
private ZonedDateTime zonedDateTime;
}
必要に応じて依存関係に com.fasterxml.jackson.datatype:jackson-datatype-jsr310
を追加
オブジェクト -> json 変換
シリアライズの説明。
@JsonSerialize
と、 @JsonFormat
を付与する。
@JsonSerialize(using = ZonedDateTimeSerializer.class)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss z")
こうなる。
ObjectMapper objectMapper = new ObjectMapper();
User obj = new User();
obj.setZonedDateTime(ZonedDateTime.now());
String json = objectMapper.writeValueAsString(obj);
System.out.println("オブジェクト--->JSON: "+json);
出力結果
オブジェクト--->JSON: {"zonedDateTime":"2021-09-20 17:51:30 JST"}
json ->オブジェクト 変換
デシリアライズ時の説明。
ZonedDateTimeDeserializer.class
は jackson-datatype-jsr310
で用意されていないため、自分で実装する。@JsonDeserialize(using = ZonedDateTimeDeserializer.class)
を付与する。
package com.example.demo.infrastructure.util;
import java.io.IOException;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
public class ZonedDateTimeDeserializer extends JsonDeserializer<ZonedDateTime> {
@Override
public ZonedDateTime deserialize(JsonParser p, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z");
return ZonedDateTime.parse(p.getText(), formatter);
}
}
こうなる。
String json1 = "{\"zonedDateTime\":\"2020-02-11 10:15:30 America/Vancouver\"}";
System.out.println("JSON--->オブジェクト: "+objectMapper.readValue(json1, User.class));
出力結果
JSON--->オブジェクト: User(zonedDateTime=2020-02-11T10:15:30-08:00[America/Vancouver])
LocalDate
型の変換は下記に記載。