当前位置: 首页 > 知识库问答 >
问题:

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

裘兴思
2023-03-14
@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行为。

共有1个答案

韦嘉颖
2023-03-14

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

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

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

使用objectmapper注册mixin:

mapper.addMixIn(POJO.class, ApprovalMixin.class);
ObjectWriter writer = mapper.writerFor(POJO.class)
                          .withAttribute("ApprovalState", "Pending");
 类似资料:
  • 问题内容: 我正在使用Jackson将应用程序的REST接口序列化为JSON表示形式的POJO域对象。我想为某些类型自定义序列化,以将其他属性添加到POJO中不存在的JSON表示中(例如,添加一些元数据,参考数据等)。我知道如何编写自己的方法,但是在那种情况下,我需要为对象的 每个* 属性显式调用方法,而我所需要的只是 添加 一个附加属性。换句话说,我希望能够编写如下内容: *** 或者(甚至更好

  • 问题内容: 我希望能够以不同于web.xml的方式修改/配置过滤器。这是2个过滤器的静态配置。我希望能够静态配置一个过滤器,并允许该过滤器加载其他过滤器。我只是想知道是否有人知道lib已有此功能。 使用Servlet API 2.5 我已经在Guice的GuiceFilter中完成了此操作,其中在运行时配置了过滤器。 问题答案: 只需执行与容器已完成的相同的工作即可。即,按照servlet过滤器所

  • 问题内容: 有没有办法可以在不重新加载页面的情况下修改当前页面的URL? 如果可能,我想访问#哈希 之前 的部分。 我只需要更改域 后 的部分,所以就好像我没有违反跨域策略一样。 问题答案: 现在,可以在Chrome,Safari,Firefox 4+和Internet Explorer 10pp4 +中完成此操作! 例: 然后,您可以用来检测后退/前进按钮的导航:

  • 我有一个以下查询,我在其中连接表、和:

  • 问题内容: 有没有办法可以在不重新加载页面的情况下修改当前页面的URL? 如果可能,我想访问#哈希 之前 的部分。 我只需要更改域 后 的部分,所以就好像我没有违反跨域策略一样。 问题答案: 现在,可以在Chrome,Safari,Firefox 4+和Internet Explorer 10pp4 +中完成此操作! 有关更多信息,请参见此问题的答案: 使用新URL更新地址栏而不散列或重新加载页面

  • 一个具有“姓名”、“地址”和“工资”属性的实体“人” 两个角色-“员工”和“经理” 虽然员工应该能够编辑他自己的地址,但他肯定不能改变他的工资或其他人的地址。虽然他可能被允许看到自己的工资和其他用户的地址,但他甚至不允许看到其他人的工资,更不用说编辑了。另一方面,manager具有完全的readwrite权限。 这在后端不是问题--我们可以在那里使用自定义bean验证来强制执行写权限。 我想收到