首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于nanos的Jackson 8 LocalDateTime序列化

基于nanos的Jackson 8 LocalDateTime序列化
EN

Stack Overflow用户
提问于 2018-11-27 09:19:52
回答 1查看 153关注 0票数 0

目前,我正在尝试将一个项目表单joda迁移到java8 time。

在用java8组件替换joda组件之后,我遇到了序列化问题。当然,我添加了依赖项并注册了新的JavaTimeModule()模块。但是当我试图序列化

代码语言:javascript
复制
LocalDateTime.of(1988, 11, 10, 7, 31, 32, 0)

我接收到一个数组[1988,11,10,7,31,32],但[1988,11,10,7,31,32,**0**]是预期的(使用nanos)。

因此,问题是:是否可以使用nanos来序列化时间,即使它是0

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-05 10:04:22

在查看了jackson LocalDateTimeSerializer代码之后,当它们的值为0时,将显式忽略秒和nanos。

代码语言:javascript
复制
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之后创建自定义序列化程序并注册其模块。

代码语言:javascript
复制
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();
    }
}
代码语言:javascript
复制
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)
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53496306

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档