【问题标题】:Spring Boot Sql Date Timestamp Json Serialization IssueSpring Boot Sql 日期时间戳 Json 序列化问题
【发布时间】:2019-12-08 13:09:39
【问题描述】:

我正在使用 Spring Boot 2,并且我有一个具有 java.sql.Date 和 java.sql.Timestamp 属性的类。我需要将时间戳序列化为纳秒并将日期序列化为标准格式(yyyy-MM-dd)。

一开始的 JSON 结果如下:

 "checkinTime": "2019-05-01T17:00:00.000+0000", // java.sql.Timestamp
 "lastOrderDate":"2019-05-01"    // java.sql.Date

然后我将这些行放在 application.properties 文件中

spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS: true
spring.jackson.serialization.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS: false

之后的结果如下:

 "checkinTime": -2209014000000,
 "lastOrderDate": 1556643600000,

我想要的是这样的

 "checkinTime": -2209014000000,   // java.sql.Timestamp
 "lastOrderDate":"2019-05-01"    // java.sql.Date

如何在 Spring Boot 中实现这一点??

【问题讨论】:

  • 您的 checkinTime 写为 ISO-8601,而不是时间戳。 (1) 在您的 DTO(也可能是实体)中使用 Instant 并 (2) 关闭 off 时间戳。
  • 我只希望我的 JSON 像我上面写的那样。你的评论我不清楚。
  • 您提供的 JSON 中没有时间戳。您需要将WRITE_DATES_AS_TIMESTAMPS 设置为false

标签: java spring spring-boot jackson-databind


【解决方案1】:

您始终可以在任何字段或类型上使用自定义格式化程序。您必须有一个自定义格式化程序类并将其添加到您的 Object Mapper bean 上。它也可以添加到 Java 代码或 Xml 配置中。如果您有自己的视图解析器,只需确保它使用您的客户对象映射器。

格式化程序可以是这样的,例如:

public class CustomDateFormatter extends JsonSerializer<Date> {

    private final DateTimeFormatter formatter;

    public CustomDateFormatter() {
        formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd").withZone(ZoneOffset.UTC);
    }

    @Override
    public void serialize(Date value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        String str = formatter.format(value.toLocalDate());
        gen.writeString(str);
    }
}

对象映射器 bean init 与视图解析器连接起来:

private ObjectMapper customObjectMapper() {
    ObjectMapper mapper = new ObjectMapper();
    SimpleModule module = new SimpleModule();
    module.addSerializer(Date.class, new CustomDateFormatter());
    mapper.registerModule(module);
    mapper.enable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
    mapper.disable(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS);
    return mapper;
}

private MappingJackson2JsonView jsonView() {
    MappingJackson2JsonView view = new MappingJackson2JsonView();
    view.setObjectMapper(customObjectMapper());
    return view;
}

@Bean
public ContentNegotiatingViewResolver viewResolver() {
    ContentNegotiatingViewResolver cnvr = new ContentNegotiatingViewResolver();
    List<View> viewList = new ArrayList<>();
    viewList.add(jsonView());
    cnvr.setDefaultViews(viewList);
    return cnvr;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 2023-03-05
    • 2020-06-07
    • 2019-08-10
    • 1970-01-01
    相关资源
    最近更新 更多