杰克逊反序列化 LocalDateTime

Jackson deserialize LocalDateTime

我有一个如下所示的时间字段值:

2020-10-01T15:30:27.4394205+03:00

我不知道如何表示为日期格式。

我需要将它反序列化为 LocalDateTime 字段。

我试过这样;

   @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS")
    private LocalDateTime timestamp;

但它不起作用。我怎样才能反序列化它? 顺便说一句,我正在使用 spring 启动。并且此值将保留在控制器请求正文中。

@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSSXXX")
private LocalDateTime timestamp;

为其编写自定义反序列化器:

@Log4j2
public class CustomLocalDateTimeDeserializer extends StdDeserializer<LocalDateTime> {

 public CustomLocalDateTimeDeserializer() {
    this(null);
}
    private CustomLocalDateTimeDeserializer(Class<LocalDateTime> t) {
        super(t);
    }

    @Override
    public LocalDateTime deserialize(JsonParser jsonParser, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        String date = jsonParser.getText();
        try {
            return LocalDateTime.parse(date);
        } catch (Exception ex) {
            log.debug("Error while parsing date: {} ", date, ex);
            throw new RuntimeException("Cannot Parse Date");
        }
    }
}

现在,使用解串器:

 @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS")
 @JsonDeserialize(using = CustomLocalDateTimeDeserializer.class)
 private LocalDateTime timestamp;

同样,如果你需要序列化,也写一个自定义的序列化器。

将模式替换为pattern = DateTimeFormatter.ISO_OFFSET_DATE_TIME

您的 date-time 字符串已采用 DateTimeFormatter.ISO_OFFSET_DATE_TIME which is the default format used by OffsetDateTime#parse 指定的格式。

演示:

import java.time.LocalDateTime;
import java.time.OffsetDateTime;

public class Main {
    public static void main(String[] args) {
        String dateTimeStr = "2020-10-01T15:30:27.4394205+03:00";

        // Parse the date-time string into OffsetDateTime
        OffsetDateTime odt = OffsetDateTime.parse(dateTimeStr);
        System.out.println(odt);

        // LocalDateTime from OffsetDateTime
        LocalDateTime ldt = odt.toLocalDateTime();
        System.out.println(ldt);
    }
}

输出:

2020-10-01T15:30:27.439420500+03:00
2020-10-01T15:30:27.439420500