【问题标题】:How to configure Jackson to convert all fields of a type to another type?如何配置 Jackson 将一个类型的所有字段转换为另一种类型?
【发布时间】:2018-07-11 14:18:58
【问题描述】:

如果我有一个 A 类型的 POJO 字段,我想将其序列化为 B 类型,我可以使用一对 Converters 轻松实现此目的:

@JsonSerialize(converter=ConvA2B.class)
@JsonDeserialize(converter=ConvB2A.class)
private A field; 

但是,如果我希望所有 POJO 中该类型的所有字段都被这样对待怎么办?是否有全局转换器配置?


为了提供一些上下文,我正在尝试serialize java.time.LocalDateTime fields as unix timestamps,我发现一个可能的解决方案是使用自定义类型转换器将每个字段转换为java.time.Instant,例如:

public static class Conv extends StdConverter<LocalDateTime, Instant> {

    @Override
    public Instant convert(LocalDateTime value) {
        return value.toInstant(ZoneOffset.UTC);
    }

}

【问题讨论】:

  • 我正在考虑使用自定义AnnotationIntrospector。您找到其他解决方案了吗?

标签: java jackson


【解决方案1】:

您可以配置 Jackson 使用的 ObjectMapper。通常,您可以配置您希望如何序列化某些类型。对于您的具体问题,您可以尝试以下方法:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;

...

private ObjectMapper createObjectMapper() {
    final ObjectMapper mapper = new ObjectMapper();
    mapper.registerModule(new JavaTimeModule());
    mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    return mapper;
}

现在,根据您的应用程序设置,您需要在某处注入/提供/配置对象映射器。

【讨论】:

    猜你喜欢
    • 2011-09-24
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 2023-02-07
    • 1970-01-01
    相关资源
    最近更新 更多