2

Jackson 运行 java.time.Instant 时默认启用WRITE_DATE_TIMESTAMPS_AS_NANOSECONDSREAD_以及)。 杰克逊-数据类型-jsr310

它产生这样的JSON

{ "createDate":1421261297.356000000, "modifyDate":1421261297.356000000 }

在 JavaScript 中,从传统的毫秒时间戳(而不是上面的秒/纳米)获取日期要容易得多,比如new Date(1421261297356).

我认为应该有一些理由默认使用 nanos 方法,那是什么原因呢?

4

2 回答 2

5

一种方法是创建您自己的 Jackson 模块并按您需要的方式进行序列化。

你甚至可以做一个简单的 Jackson8Module 扩展 Jackson SimpleModule 并提供一些 lambda 友好的方法。

ObjectMapper jacksonMapper = new ObjectMapper();
Jackson8Module module = new Jackson8Module();
module.addStringSerializer(LocalDate.class, (val) -> val.toString());
module.addStringSerializer(LocalDateTime.class, (val) -> val.toString());
jacksonMapper.registerModule(module);

这是 Jackson8Module 的代码:

有没有办法使用 Java 8 lambda 样式添加自定义 Jackson 序列化程序?

于 2015-01-26T19:07:07.977 回答
5

我发现这很奇怪,因为使用 JSR310Module 类(如 Calendar 或 Date)仍以毫秒为单位进行序列化。这不合逻辑。

在 JSR310Module 文档(https://github.com/FasterXML/jackson-datatype-jsr310)中,他们引用了这个:

对于序列化,时间戳写为小数(小数),其中数字是秒,小数是小数秒,如果启用了 WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS(默认情况下),分辨率可以达到纳秒,具体取决于底层 JDK 实现。如果禁用 WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS,则时间戳将写入整数毫秒。

所以,一个简单的解决方案是你想要实现的,就像他们说的那样配置你的映射器:

  mapper.configure( SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS, false );
  mapper.configure( SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, true );
于 2016-09-05T16:16:00.417 回答