杰克逊自定义日期格式化程序

Jackson custom date formatter

我想将带有日期字段的 Json 对象序列化为 Pojo。 例如

{
   date: <some arbitrary date format>
}

@JsonFormat(???)
LocalDateTime dateTime;

问题是日期可以是任意数量的格式。例如,可能只是一年,只是一个日期,或者日期和时间。甚至那些可以有多种格式。

2021
2021-5-23
2021/05/23
2021/05/23 02:07
2021-05-23 02:07:53
2021/05/23 02:07:50.567

我已经编写了一个具有格式列表的解析器,并将遍历它们直到找到一个可用的格式。我如何编写使用该代码的自定义 Jackson 序列化程序或格式化程序,并可以从 Json 对象中获取字符串并将其正确转换为 Pojo 中的 Date 或 LocalDateTime 对象?

如果有影响,我也在 SpringBoot 中这样做

我想,你是在谈论反序列化?如果是这样,您可以创建自己的 JsonDeserializer that supports LocalDateTime and register it with JsonComponent。这看起来像这样:

(可以通过 p.getText() 访问“输入”)

@JsonComponent
public class LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {

  @Override
  public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt)
      throws IOException, JsonProcessingException {
    String stringValue = p.getText();
    // Use your parser instead of this
    DateTimeFormatter formatter = new DateTimeFormatterBuilder().appendPattern("yyyy[-MM-dd HH:mm:ss]")
        .parseDefaulting(ChronoField.MONTH_OF_YEAR, 1)
        .parseDefaulting(ChronoField.DAY_OF_MONTH, 1)
        .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
        .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
        .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0).toFormatter();
    return LocalDateTime.parse(stringValue, formatter);
  }

}