[SpringBoot] Jackson で ZonedDateTime を json <-> オブジェクトに変換

JavaSpringBoot

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.classjackson-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 型の変換は下記に記載。

Posted by Agopeanuts