Jackson为X型的所有字段添加自定义序列化程序

时间:2017-07-05 16:13:19

标签: java json serialization jackson

我有一个这样的课程:

public class Foo {
    private Integer id;
    private FooB fooA;
    private boolean isB;
    private boolean isC;
    private int age;
    private LocalDate date1;
    private LocalDate date2;
    private LocalDate date3;
    private LocalDate date4;
}

我希望序列化此类中的所有内容之外的LocalDate字段。我有一个自定义序列化器,如下所示:

public class LocalDateSerializer extends JsonSerializer<LocalDate> {
    @Override
    public void serialize(LocalDate localDate, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
        //serialize
    }
}

有没有办法注释类Foo,只说对LocalDate 类型的对象使用序列化程序我是否必须像这样对每个字段进行注释:

public class Foo {
    private Integer id;
    private FooB fooA;
    private boolean isB;
    private boolean isC;
    private int age;
    @JsonSerialize(using = LocalDateSerializer.class)
    private LocalDate date1;
    @JsonSerialize(using = LocalDateSerializer.class)
    private LocalDate date2;
    @JsonSerialize(using = LocalDateSerializer.class)
    private LocalDate date3;
    @JsonSerialize(using = LocalDateSerializer.class)
    private LocalDate date4;
}

我的问题是,我可以将其合并到单个级别的注释中吗?

1 个答案:

答案 0 :(得分:0)

我找不到在类中只使用一个注释的解决方案。可能会给每个领域注释是最好的。

另一种方法是以编程方式配置ObjectMapper

ObjectMapper om = new ObjectMapper();
JavaTimeModule module = new JavaTimeModule();
module.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("dd/MM/yyyy")));
om.registerModule(module);

addSerializer方法映射所有LocalDate字段以使用指定的序列化程序。在上面的示例中,我使用内置com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializerDateTimeFormatter,但当然您可以将其替换为您想要的任何序列化程序(包括您的自定义程序)。

如果您不想(或不能)配置ObjectMapper,那么在每个字段上使用注释似乎是最佳解决方案。