【问题标题】:How to handle multiple date formats with springboot and jackson如何使用 springboot 和 jackson 处理多种日期格式
【发布时间】:2021-07-09 20:06:03
【问题描述】:

在 post 请求的 json 中,我有几种不同的日期格式。我在同时反序列化时遇到了麻烦。我创建了一个配置类,可以很好地处理其中一个。如何添加额外的反序列化器来处理其他格式?

我无权访问 POJO 以在其中添加任何注释。

这是我无法反序列化的日期之一的错误 JSON 解析错误:无法从字符串“09/03/2020 10:59:48”反序列化 java.time.LocalDateTime 类型的值:无法反序列化 java.time.LocalDateTime:

@Configuration
public class JacksonConfig {

    
    @Bean
    @Primary
    public ObjectMapper objectMapper() {
        JavaTimeModule module = new JavaTimeModule();
        LocalDateTimeDeserializer localDateTimeDeserializer = new LocalDateTimeDeserializer(
                DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm:ss"));
        module.addDeserializer(LocalDateTime.class, localDateTimeDeserializer);
        return Jackson2ObjectMapperBuilder.json().modules(module)
                .featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS).build();
    }

}

【问题讨论】:

    标签: java spring-boot jackson


    【解决方案1】:

    我能够通过覆盖 LocalDateTimeDeserializer 的反序列化方法来解决我的问题。我从Configure Jackson to parse multiple date formats修改了解决方案

    public class MultiDateDeserializer extends LocalDateTimeDeserializer {
    
        public MultiDateDeserializer() {
            this(null);
        }
    
        public MultiDateDeserializer(DateTimeFormatter formatter) {
            super(formatter);
        }
    
        private static final long serialVersionUID = 1L;
    
        private static final String[] DATE_FORMATS = new String[] { "yyyy-MM-dd'T'HH:mm:ss", "MM/dd/yyyy HH:mm:ss" };
    
        @Override
        public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
            JsonNode node = p.getCodec().readTree(p);
            final String date = node.textValue();
    
            for (String DATE_FORMAT : DATE_FORMATS) {
                DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DATE_FORMAT, Locale.ROOT);
                try {
                    return LocalDateTime.parse(date, formatter);
                } catch (DateTimeParseException e) {
                
                }
            }
            throw new ParseException(0,
                    "Unparseable date: \"" + date + "\". Supported formats: " + Arrays.toString(DATE_FORMATS));
        }
    }
    

    然后在我的 JacksonConfig 中...

    @Configuration
    public class JacksonConfig {
            @Bean
            @Primary
            public ObjectMapper objectMapper() {
                JavaTimeModule module = new JavaTimeModule();
                MultiDateDeserializer multiDateDeserializer = new MultiDateDeserializer();
                module.addDeserializer(LocalDateTime.class, multiDateDeserializer);
                return Jackson2ObjectMapperBuilder.json().modules(module)
                        .featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS).build();
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 2015-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多