使用Nano的Jackson Java 8 LocalDateTime序列化
目前,我正在尝试将一个项目从joda time迁移到java8 time api 在用java8组件替换joda组件之后,我遇到了序列化问题。当然,我添加了依赖项并注册了新的使用Nano的Jackson Java 8 LocalDateTime序列化,java,serialization,jackson,jodatime,Java,Serialization,Jackson,Jodatime,目前,我正在尝试将一个项目从joda time迁移到java8 time api 在用java8组件替换joda组件之后,我遇到了序列化问题。当然,我添加了依赖项并注册了新的JavaTimeModule()module。 但是当我尝试序列化时 LocalDateTime.of(1988, 11, 10, 7, 31, 32, 0) 我收到一个数组[1988,11,10,7,31,32],但是[1988,11,10,7,31,32,**0**]是预期的(使用nanos) 因此,问题是:即使时间为
JavaTimeModule()
module。
但是当我尝试序列化时
LocalDateTime.of(1988, 11, 10, 7, 31, 32, 0)
我收到一个数组[1988,11,10,7,31,32]
,但是[1988,11,10,7,31,32,**0**]
是预期的(使用nanos)
因此,问题是:即使时间为0,也可以用nano序列化时间吗?在查看jackson
LocalDateTimeSerializer
代码后,当秒和nano的值为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();
}
}
查看jackson
LocalDateTimeSerializer
代码后,当秒和nano的值为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();
}
}
谢谢希望它能起作用。但这与我无关)谢谢。希望它能起作用。但这与我无关了)