一尘不染

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

json

我正在使用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行为。


阅读 236

收藏
2020-07-27

共1个答案

一尘不染

寻找更多的后 杰克逊
的源代码,我的结论是,这是根本不可能实现的,而不写我自己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

2020-07-27