And*_*kyi 2 timestamp milliseconds java-8 jackson-modules java-time
Jackson运行java.time.Instant,默认情况下启用WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS(READ_以及).
杰克逊-数据类型- jsr310
它像这样生成JSON
{ "createDate":1421261297.356000000, "modifyDate":1421261297.356000000 }
在JavaScript中,从传统的millis时间戳(而不是像上面的秒/纳米)那样获得Date要容易得多,比如new Date(1421261297356).
我认为应该有一些理由默认采用纳米方法,那么这是什么原因呢?
一种方法是创建自己的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);
Run Code Online (Sandbox Code Playgroud)
以下是Jackson8Module的代码:
有没有办法使用Java 8 lambda样式添加自定义Jackson序列化程序?
我发现这很奇怪,因为使用诸如Calendar或Date之类的JSR310Module类仍会在毫秒内序列化。这是不合逻辑的。
在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 );
Run Code Online (Sandbox Code Playgroud)