我不再使用java.sql.Timestamp
和java.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);
答案 0 :(得分:2)
在JavaDoc to JavaTimeModule(包含在jackson-datatype-jsr310
库中)中,我们可以阅读以下内容:
如果启用了
java.time
功能,则大多数SerializationFeature.WRITE_DATES_AS_TIMESTAMPS
类型都将序列化为数字(适当的整数或小数)[...][...]如果禁用
SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS
,则将时间戳记为整数毫秒。 [...]
然后:
此标准序列化/反序列化规则的一些例外情况:
- [...]
LocalDate
,LocalTime
,LocalDateTime
和OffsetTime
,它们无法移植为时间戳,而是在启用WRITE_DATES_AS_TIMESTAMPS
时表示为数组。
您确实可以看到LocalDateTime
不能普遍转换为Unix时间戳,因为它的toEpochSecond方法采用ZoneOffset
作为参数。
总结,看来您可以做的最好的事情就是将LocalDateTime
替换为Instant
(请参见this great answer,以了解{ {1}}和LocalDateTime
)。
除此之外,您确实需要自定义Instant
和JsonSerializer
。
这是一个工作代码示例:
JsonDeserializer