有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

json如何为java定制全局jackson反序列化器。时间LocalDateTime

Jackson的JavaTimeModule在全局范围内很好地序列化/反序列化java.time,但是它的默认日期时间格式是ISO标准的,比如2018-01-10T10:20:30表示LocalDateTime,而2018-01-10T10:20:30+08:00表示OffsetDateTime。但是我需要为LocalDateTime和OffsetDateTime设置一个全局本地格式,比如2018-01-10 10:20:30,而不使用T和OffsetTime(使用本地默认OffsetTime)。我该怎么做

Notes: I know about @JsonFormat, @JsonSerialize and @JsonDeserialize. That is not global setting.


共 (3) 个答案

  1. # 1 楼答案

    如果您在全局范围内使用ObjectMapper的单个实例(并且想要一个独立于Spring/Java 8 jackson模块的解决方案),您可以执行以下操作:

    public ObjectMapper getCustomConfigMapper() {
        final ObjectMapper mapper = new ObjectMapper();
        final SimpleModule module = new SimpleModule();
        module.addDeserializer(LocalDateTime.class, new CustomLocaDateTimeDeserializer());
        mapper.registerModule(module);
        return mapper;
    }
    
    public static class CustomLocaDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {
    
        public static final DateTimeFormatter CUSTOM_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    
        @Override
        public LocalDateTime deserialize(JsonParser jsonParser, DeserializationContext __) throws IOException {
            final String value = jsonParser.getText().strip();
            return LocalDateTime.parse(value, CUSTOM_FORMATTER);
        }
    }
    
  2. # 2 楼答案

    弹簧靴

        @SpringBootApplication
        public class Application implements Jackson2ObjectMapperBuilderCustomizer {
            public static void main(String[] args) {
                SpringApplication.run(Application.class, args);
            }
    
            @Override
            public void customize(Jackson2ObjectMapperBuilder builder) {
                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
                LocalDateTimeSerializer localDateTimeSerializer = new LocalDateTimeSerializer(formatter);
    
                builder.failOnEmptyBeans(false) // prevent InvalidDefinitionException Error
                        .serializerByType(LocalDateTime.class, localDateTimeSerializer);
            }
        }
    

    Springboot&;Spring框架

        @Configuration
        public class WebMvcConfig implements WebMvcConfigurer {
            @Override
            public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
                DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
                LocalDateTimeSerializer localDateTimeSerializer = new LocalDateTimeSerializer(formatter);
                LocalDateTimeDeserializer localDateTimeDeserializer = new LocalDateTimeDeserializer(formatter);
    
                JavaTimeModule module = new JavaTimeModule();
                module.addSerializer(LocalDateTime.class, localDateTimeSerializer);
                module.addDeserializer(LocalDateTime.class, localDateTimeDeserializer);
    
                ObjectMapper mapper = new ObjectMapper();
                mapper.registerModule(module);
                // add converter at the very front
                // if there are same type mappers in converters, setting in first mapper is used.
                converters.add(0, new MappingJackson2HttpMessageConverter(mapper));
            }
        }
    

    希望这能对你有所帮助