将LocalDate和LocalDateTime序列化为Unix时间戳

时间:2018-07-11 11:41:39

标签: java spring spring-mvc jackson java-time

我不再使用java.sql.Timestampjava.util.GregorianCalendar在Spring MVC应用程序中使用java.time.*新类。

所以我每次都改变

private GregorianCalendar field;

private LocalDate field;

private LocalDateTime field;

但是现在序列化这些bean时,它们会像这样被序列化:

"field": {
      "year": 1970,
      "month": "JANUARY",
      "dayOfMonth": 18,
      "dayOfWeek": "SUNDAY",
      "era": "CE",
      "dayOfYear": 18,
      "leapYear": false,
      "monthValue": 1,
      "chronology": {
        "id": "ISO",
        "calendarType": "iso8601"
      }
    },

我找到了其他提到jackson-datatype-jsr310添加依赖项的问题的答案,并获得:

 "field": [
      1970,
      1,
      18
    ],

但是我在进行序列化时仍然希望使用unix时间戳,就像使用GregorianCalendar字段一样:如何实现?我可以避免使用自定义序列化程序(和反序列化程序)吗?

这些与资源响应和请求正文(如POST,PUT等)有关,与请求参数无关。

Jackson ObjectMapper的配置如下:

jacksonConverter.getObjectMapper().enable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
jacksonConverter.getObjectMapper().disable(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS);

1 个答案:

答案 0 :(得分:2)

在JavaDoc to JavaTimeModule(包含在jackson-datatype-jsr310库中)中,我们可以阅读以下内容:

  

如果启用了java.time功能,则大多数SerializationFeature.WRITE_DATES_AS_TIMESTAMPS类型都将序列化为数字(适当的整数或小数)[...]

     

[...]如果禁用SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS,则将时间戳记为整数毫秒。 [...]

然后:

  

此标准序列化/反序列化规则的一些例外情况:

     
      
  • [...]
  •   
  • LocalDateLocalTimeLocalDateTimeOffsetTime,它们无法移植为时间戳,而是在启用WRITE_DATES_AS_TIMESTAMPS时表示为数组。
  •   

您确实可以看到LocalDateTime不能普遍转换为Unix时间戳,因为它的toEpochSecond方法采用ZoneOffset作为参数。

总结,看来您可以做的最好的事情就是将LocalDateTime替换为Instant(请参见this great answer,以了解{ {1}}和LocalDateTime)。

除此之外,您确实需要自定义InstantJsonSerializer


这是一个工作代码示例:

JsonDeserializer