java - Spring Boot Jackson 日期格式

标签 java spring-boot jackson date-format

我在 SpringBoot 中遇到了 Jackson 的问题。我的 Controller 以 yyyy-MM-dd'T'HH:mm:ss'Z' 格式返回日期,但我需要 yyyy-MM-dd'T'HH:mm:ss。 SSS'Z'(用于使用 date-fns 库的 Angular 中的 mwl-calendar)。

Controller :

@GetMapping(value = "/slots", produces = MediaType.APPLICATION_JSON_VALUE)
public Set<SlotResponse> timeSlots() {
    return slotService.getSlots();
}

插槽响应:

@Data
public class SlotResponse {
    private Instant start;
    private Instant end;
}

额外的依赖:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
</dependency>

我尝试过:

  1. 使用 @JsonFormat(pattern="yyyy-MM-dd'T'HH:mm:ss.SSS'Z'") 注解
  2. 使用spring.jackson.date-format=yyyyMMddTHH:mm:ss.SSSZ配置
  3. 手动创建ObjectMapper:
@Bean
public ObjectMapper objectMapper() {
    ObjectMapper mapper = new ObjectMapper();
    mapper.registerModule(new JavaTimeModule());
    mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
    mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"));
    return mapper;
}
  • 启用选项SerializationFeature.WRITE_DATES_WITH_ZONE_IDSerializationFeature.WRITE_DATES_WITH_CONTEXT_TIME_ZONE
  • 但这一切并没有生效。每次我看到这个结果:

    [{"start":"2023-05-11T16:00:00Z","end":"2023-05-11T17:00:00Z"}]
    

    我使用Java 17、SpringBoot 2.7.0、Jackson 2.13.3

    出了什么问题?

    最佳答案

    您可以为 Instant 类型创建自定义 json 序列化程序:

        public static class InstantSerializer extends StdSerializer<Instant> {
    
            public InstantSerializer() {
                super(Instant.class);
            }
    
            @Override
            public void serialize(
                @Nullable final Instant value,
                @NonNull final JsonGenerator jsonGenerator,
                @NonNull final SerializerProvider serializerProvider
            ) throws IOException {
                if (value != null) {
                    final DateTimeFormatter formatter = DateTimeFormatter
                        .ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
                        .withZone(ZoneId.systemDefault());
                    final String text = formatter.format(value);
                    jsonGenerator.writeString(text);
                }
            }
    
        }
    

    然后在您想要遵循格式的字段上使用它:

        @Data
        public class SlotResponse {
    
            @JsonSerialize(using = InstantSerializer.class) // Add this
            
            private Instant start;
            @JsonSerialize(using = InstantSerializer.class) // Add this
            private Instant end;
        }
    

    如果您想让这适用于您的整个系统,您可以将序列化器添加到 jackson:

        @Bean
        public ObjectMapper objectMapper() {
            ObjectMapper mapper = new ObjectMapper();
            ...
            final SimpleModule module = new SimpleModule();
            module.addSerializer(new InstantSerializer());
            mapper.registerModule(module);
            ...
            return mapper;
        }
    
    

    关于java - Spring Boot Jackson 日期格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76225352/

    相关文章:

    java - 如何将 ImageJ 用作单独 Java 应用程序的库?

    java - 将空集设置为 SQL IN 参数时出现 SQLGrammarException

    Java将Base64转换为十六进制字符串

    java - 使用带有动态字段的 Jackson 注释反序列化 JSON

    java - 如何在我的 JSON 响应中隐藏信息?

    java - 是否有一个固定大小的队列可以删除过多的元素?

    java - 如何在不读取 application.properties 的情况下以编程方式初始化辅助/其他数据源

    spring-boot - 在 Spring JMS 监听器中禁用事务管理

    java - 在 Spring Boot 中添加依赖文件后,我有/newart.jsp 抛出我犯错误的地方

    java - jackson 没有填充所有属性