gpt4 book ai didi

java - Jackson:如何在不修改 POJO 的情况下向 JSON 添加自定义属性

转载 作者:IT老高 更新时间:2023-10-28 12:44:56 34 4
gpt4 key购买 nike

我正在为我的应用程序开发一个 REST 接口(interface),使用 Jackson 将我的 POJO 域对象序列化为 JSON 表示。我想为某些类型自定义序列化,以向 POJO 中不存在的 JSON 表示添加其他属性(例如,添加一些元数据、引用数据等)。我知道如何编写自己的 JsonSerializer,但在这种情况下,我需要为 each 显式调用 JsonGenerator.writeXXX(..) 方法我的对象的属性,而我只需要添加一个附加属性。换句话说,我希望能够写出类似的东西:

@Override
public void serialize(TaxonomyNode value, JsonGenerator jgen, SerializerProvider provider) {
jgen.writeStartObject();
jgen.writeAllFields(value); // <-- The method I'd like to have
jgen.writeObjectField("my_extra_field", "some data");
jgen.writeEndObject();
}

或者(甚至更好)在 jgen.writeEndObject() 调用之前以某种方式拦截序列化,例如:

@Override void beforeEndObject(....) {
jgen.writeObjectField("my_extra_field", "some data");
}

我以为我可以扩展 BeanSerializer 并覆盖它的 serialize(..) 方法,但它被声明为 final 并且我也找不到一种创建 BeanSerializer 新实例的简单方法,无需提供所有类型元数据详细信息,实际上复制了 Jackson 的大部分内容。所以我已经放弃了。

我的问题是 - 如何自定义 Jackson 的序列化以向特定 POJO 的 JSON 输出添加额外的内容,而不引入过多的样板代码并尽可能多地重用默认的 Jackson 行为。

最佳答案

Jackson 2.5 引入了 @JsonAppend注释,可用于在序列化过程中添加“虚拟”属性。它可以与mixin功能一起使用,以避免修改原始POJO。

以下示例在序列化过程中添加了一个 ApprovalState 属性:

@JsonAppend(
attrs = {
@JsonAppend.Attr(value = "ApprovalState")
}
)
public static class ApprovalMixin {}

使用 ObjectMapper 注册 mixin:

mapper.addMixIn(POJO.class, ApprovalMixin.class);

在序列化过程中使用ObjectWriter设置属性:

ObjectWriter writer = mapper.writerFor(POJO.class)
.withAttribute("ApprovalState", "Pending");

使用 writer 进行序列化会将 ApprovalState 字段添加到输出中。

关于java - Jackson:如何在不修改 POJO 的情况下向 JSON 添加自定义属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14714328/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com