Jackson Java 8 使用纳米的 LocalDateTime 序列化
Jackson Java 8 LocalDateTime serialization with nanos
目前,我正在尝试将项目从 joda 时间迁移到 java8 时间 api。
用 java8 组件替换 joda 组件后,我遇到了序列化问题。当然,我添加了依赖项并注册了新的 JavaTimeModule()
模块。
但是当我尝试序列化
LocalDateTime.of(1988, 11, 10, 7, 31, 32, 0)
我收到一个数组 [1988,11,10,7,31,32]
,但预计 [1988,11,10,7,31,32,**0**]
(使用纳米)。
所以,问题是:是否可以用纳米序列化时间,即使它是 0?
在查看了 jackson LocalDateTimeSerializer
代码后,秒和纳米在它们的值为 0
时被明确忽略
private final void _serializeAsArrayContents(LocalDateTime value, JsonGenerator g, SerializerProvider provider) throws IOException {
g.writeNumber(value.getYear());
g.writeNumber(value.getMonthValue());
g.writeNumber(value.getDayOfMonth());
g.writeNumber(value.getHour());
g.writeNumber(value.getMinute());
int secs = value.getSecond();
int nanos = value.getNano();
if (secs > 0 || nanos > 0) {
g.writeNumber(secs);
if (nanos > 0) {
if (this.useNanoseconds(provider)) {
g.writeNumber(nanos);
} else {
g.writeNumber(value.get(ChronoField.MILLI_OF_SECOND));
}
}
}
}
为了达到预期的结果,您必须创建自定义序列化程序并在 JavaTimeModule
之后注册其模块
public class LocalDateTimeWithNanoSerializer extends StdSerializer<LocalDateTime> {
public LocalDateTimeWithNanoSerializer() {
super(LocalDateTime.class);
}
@Override
public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider provider) throws IOException {
gen.writeStartArray();
gen.writeNumber(value.getYear());
gen.writeNumber(value.getMonthValue());
gen.writeNumber(value.getDayOfMonth());
gen.writeNumber(value.getHour());
gen.writeNumber(value.getMinute());
gen.writeNumber(value.getSecond());
gen.writeNumber(value.getNano());
gen.writeEndArray();
}
}
public class Application {
public static void main(String[] args) {
SimpleModule myModule = new SimpleModule();
myModule.addSerializer(new LocalDateTimeWithNanoSerializer());
ObjectMapper objectMapper = new ObjectMapper()
.registerModule(new JavaTimeModule())
.registerModule(myModule)
}
}
目前,我正在尝试将项目从 joda 时间迁移到 java8 时间 api。
用 java8 组件替换 joda 组件后,我遇到了序列化问题。当然,我添加了依赖项并注册了新的 JavaTimeModule()
模块。
但是当我尝试序列化
LocalDateTime.of(1988, 11, 10, 7, 31, 32, 0)
我收到一个数组 [1988,11,10,7,31,32]
,但预计 [1988,11,10,7,31,32,**0**]
(使用纳米)。
所以,问题是:是否可以用纳米序列化时间,即使它是 0?
在查看了 jackson LocalDateTimeSerializer
代码后,秒和纳米在它们的值为 0
private final void _serializeAsArrayContents(LocalDateTime value, JsonGenerator g, SerializerProvider provider) throws IOException {
g.writeNumber(value.getYear());
g.writeNumber(value.getMonthValue());
g.writeNumber(value.getDayOfMonth());
g.writeNumber(value.getHour());
g.writeNumber(value.getMinute());
int secs = value.getSecond();
int nanos = value.getNano();
if (secs > 0 || nanos > 0) {
g.writeNumber(secs);
if (nanos > 0) {
if (this.useNanoseconds(provider)) {
g.writeNumber(nanos);
} else {
g.writeNumber(value.get(ChronoField.MILLI_OF_SECOND));
}
}
}
}
为了达到预期的结果,您必须创建自定义序列化程序并在 JavaTimeModule
public class LocalDateTimeWithNanoSerializer extends StdSerializer<LocalDateTime> {
public LocalDateTimeWithNanoSerializer() {
super(LocalDateTime.class);
}
@Override
public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider provider) throws IOException {
gen.writeStartArray();
gen.writeNumber(value.getYear());
gen.writeNumber(value.getMonthValue());
gen.writeNumber(value.getDayOfMonth());
gen.writeNumber(value.getHour());
gen.writeNumber(value.getMinute());
gen.writeNumber(value.getSecond());
gen.writeNumber(value.getNano());
gen.writeEndArray();
}
}
public class Application {
public static void main(String[] args) {
SimpleModule myModule = new SimpleModule();
myModule.addSerializer(new LocalDateTimeWithNanoSerializer());
ObjectMapper objectMapper = new ObjectMapper()
.registerModule(new JavaTimeModule())
.registerModule(myModule)
}
}