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
我使用的 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