当前位置: 首页 > 面试题库 >

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

陈茂
2023-03-14
问题内容

我正在使用Jackson将应用程序的REST接口序列化为JSON表示形式的POJO域对象。我想为某些类型自定义序列化,以将其他属性添加到POJO中不存在的JSON表示中(例如,添加一些元数据,参考数据等)。我知道如何编写自己的方法JsonSerializer,但是在那种情况下,我需要为对象的
每个* 属性显式调用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的序列化为特定POJO的JSON输出添加其他内容,而又不引入过多的样板代码以及尽可能多地重用默认的Jackson行为。


问题答案:

寻找更多的后 杰克逊
的源代码,我的结论是,这是根本不可能实现的,而不写我自己BeanSerializerBeanSerializerBuilderBeanSerializerFactory并提供一些扩展点,如:

/*
/**********************************************************
/* Extension points
/**********************************************************
 */

protected void beforeEndObject(T bean, JsonGenerator jgen, SerializerProvider provider) throws IOException, JSONException {
    // May be overridden
}

protected void afterStartObject(T bean, JsonGenerator jgen, SerializerProvider provider) throws IOException, JSONException {
    // May be overridden
}

不幸的是,我不得不将整个 Jackson
BeanSerializer源代码复制并粘贴到其中,MyCustomBeanSerializer因为前者不是为将所有字段和一些重要方法(如serialize(...))声明为扩展名而开发的。final



 类似资料:
  • 或者(甚至更好)在调用之前以某种方式截取序列化,例如: 我想我可以扩展并重写它的方法,但它被声明为,而且我找不到一种简单的方法来创建的新实例,而不为它提供所有类型元数据细节,这实际上是复制Jackson的一个很好的部分。所以我已经放弃了。 我的问题是-如何定制Jackson的序列化,为特定POJO向JSON输出添加额外的内容,而不引入太多的样板代码,并尽可能多地重用默认的Jackson行为。

  • 问题:试图将JSON从http请求(Google方向)转换为POJO(只是我自己的类)。我现在已经有了“根”类“GoogleGeoCodeResponse”(文本中的GGCR,包含一些顶级字段,如status、routes等),其中还有一些其他字段(routes包含这个类和那个类,等等)。我要走了 尝试使用

  • 问题内容: 我需要从Java pojo创建这样的Json有效负载: 所以我创建了一个Java pojo像这样: 我喜欢将Label类中的“ add”属性设置为动态,以便它也可以采用诸如“ remove”,“ set”之类的值。除了为每个人创建另一个POJO之外,还有其他方法吗? 问题答案: 您可以使用JsonAnyGetter批注来创建动态对。下面的示例显示了如何为同一类生成3个不同的键: 上面的

  • 我很好奇Jackson如何创建对象,包括没有设置器的私有属性/字段,并且只使用对象空构造函数。 我之所以问这个问题,是因为当我反序列化某些属性时,我想根据这些值自动设置其他属性。例如,我不想序列化图像,只想序列化它的路径。路径反序列化后,字段Image可以加载实际图像。构造反序列化对象后,尚未分配字段。从逻辑上讲,getter没有被调用。那么是什么巫毒魔法在触摸我的物品的私人部分呢? 但是,当杰克

  • 我如何告诉Jackson忽略JSON名称? 我有以下POJO: 当我有这样的东西: “ABCName”:“foo”,然后杰克逊没有认出它抛出错误。 它期望的是: “abcName”:“foo”。 代码: 输出:{"abcname":"Foo"} 然后我试着用@JsonProperty(“ABCName”)注释ABCName 在我注释并运行代码之后,我得到的是:{“ABCName”:“Foo”,“A

  • 问题内容: 我知道如果文件User.json有 我可以像这样构造一个User对象: 但是,如果文件User.json具有以下内容,该如何构造对象列表: ? 问题答案: 多种方式:如果您具有这些的JSON数组,则可以执行以下操作: 或者,如果只是一系列根级别值,则可以执行以下操作: 并遍历值(添加到列表等)