Jackson 子类序列化

Jackson Subclass serialization

我使用的 java API 我不拥有也无法修改。 API 定义了一个 class Aggregation,它是一个 Immutables (immutables.github.io) 抽象 class,带有 Jackson 序列化和反序列化。

class 看起来像

@Value.Immutable
@JsonSerialize(as = Immutable_Aggregation.class)
@JsonDeserialize(as = Immutable_Aggregation.class)
public abstract class Aggregation {

我想在聚合中添加一个字段,它应该在序列化时获取,但它的实例仍然可以传递给接受 Aggregation 的方法。

我想做这样的事情:

public abstract class ExtendedAggregation extends Aggregation {}

这可能吗?

我没能如你所愿地在标有@Value.Immutable的两个class之间继承,所以我尝试使用Jackson来解决这个问题。

找到以下方法,它使用 @JsonAppend 注释和 mixins 来添加属性而不触及 Aggregation class。

首先,使用注解定义一个混入class:

@JsonAppend(
    attrs = {
        @JsonAppend.Attr(value = "version")
})
public class AggregationMixin {}

使用您的 ObjectMapper 实例注册 Mixin:

mapper.addMixIn(Aggregation.class, AggregationMixin.class);

通过创建专用 ObjectWriter 来序列化 class,在其中指定添加的值 属性:

ObjectWriter writer = om.writerFor(Aggregation.class).withAttribute("version", "42");
...    
String output = writer.writeValueAsString(aggregationInstance);

@JsonAppend 注释可以配置为以多种方式获取其值。有关详细信息,请参阅其文档。

进一步阅读:

http://www.baeldung.com/jackson-advanced-annotations#jsonappend http://wiki.fasterxml.com/JacksonMixInAnnotations