Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Nano的Jackson Java 8 LocalDateTime序列化_Java_Serialization_Jackson_Jodatime - Fatal编程技术网

使用Nano的Jackson Java 8 LocalDateTime序列化

使用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) 因此,问题是:即使时间为

目前,我正在尝试将一个项目从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)


因此,问题是:即使时间为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();
    }
}

谢谢希望它能起作用。但这与我无关)谢谢。希望它能起作用。但这与我无关了)