杰克逊在运行java.time.Instant时默认启用了WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS (以及READ_)。jackson-datatype-jsr310
它会像这样生成JSON
{ "createDate":1421261297.356000000, "modifyDate":1421261297.356000000 }
在JavaScript中,从传统的millis时间戳(而不是上面的秒/纳米)获取日期要容易得多,比如new Date(1421261297356)。
我认为默认情况下应该有一些理由使用nanos方法,那么是什么原因呢?
发布于 2015-01-27 03:07:08
一种方法是创建您自己的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的代码:
Is there a way to use Java 8 lambda style to add custom Jackson serializer?
发布于 2016-09-06 00:16:00
我发现这很奇怪,因为像日历或日期这样的JSR310Module类仍然是以毫秒为单位进行序列化的。这不符合逻辑。
在JSR310Module文档(https://github.com/FasterXML/jackson-datatype-jsr310)中,他们引用了以下内容:
对于序列化,如果启用了WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS (默认情况下),时间戳将被写成小数(小数),其中数字是秒,小数是小数秒,分辨率高达纳秒,具体取决于底层
实现。如果禁用WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS,则时间戳以整数毫秒为单位写入。
所以,你想实现的一个简单的解决方案就是像他们说的那样配置你的映射器:
mapper.configure( SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS, false );
mapper.configure( SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, true );https://stackoverflow.com/questions/27951124
复制相似问题