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

Ric*_*ard 6 java serialization json 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

有没有一种方法可以对类进行注释,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;
}
Run Code Online (Sandbox Code Playgroud)

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

小智 0

我找不到一种在类中仅使用一个注释的解决方案。也许对每个字段进行注释是你能得到的最好的结果。


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

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

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

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