java - Jackson Java 8 LocalDateTime 使用 nanos 序列化

标签 java serialization jackson jodatime

目前,我正在尝试将项目从 joda time 迁移到 java8 time 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**] 是预期的(使用 nano)。

所以,问题是:是否可以用纳秒序列化时间,即使它是 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)
    }
}

关于java - Jackson Java 8 LocalDateTime 使用 nanos 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53496306/

相关文章:

java - Spring反序列化带有额外列的manytomany表

java - 为什么我需要另一个新的 ArrayList,而不是将现有的 ArrayList 传递到 ArrayList 中?

c# - Json.Net 从驼峰表示法反序列化为标准 .Net 属性表示法(无属性)

c# - 无法反序列化 xml 文件

java - Jackson TypeReference 在扩展时是否有效?

java - 如何使用 Jackson 解析可能是字符串也可能是数组的 json 字段

java - 在java中使用xpath选择多个节点

Java 停止进程并关闭流

java - 将字符串解析为 JSON

Django Rest框架序列化程序排除深度为2的外键