我正在使用Jackson将应用程序的REST接口序列化为JSON表示形式的POJO域对象。我想为某些类型自定义序列化,以将其他属性添加到POJO中不存在的JSON表示中(例如,添加一些元数据,参考数据等)。我知道如何编写自己的方法JsonSerializer,但是在那种情况下,我需要为对象的 每个* 属性显式调用JsonGenerator.writeXXX(..)方法,而我所需要的只是 添加 一个附加属性。换句话说,我希望能够编写如下内容: ***
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()调用之前拦截序列化,例如:
jgen.writeEndObject()
@Override void beforeEndObject(....) { jgen.writeObjectField("my_extra_field", "some data"); }
我以为可以扩展BeanSerializer和覆盖它的serialize(..)方法,但是已经声明了它final,而且我也找不到一种简单的方法来创建一个新实例,BeanSerializer而没有为它提供所有类型的元数据细节,而实际上却复制了杰克逊的大部分内容。所以我已经放弃了。
BeanSerializer
serialize(..)
final
我的问题是 -如何自定义Jackson的序列化为特定POJO的JSON输出添加其他内容,而又不引入过多的样板代码以及尽可能多地重用默认的Jackson行为。
寻找更多的后 杰克逊 的源代码,我的结论是,这是根本不可能实现的,而不写我自己BeanSerializer,BeanSerializerBuilder和BeanSerializerFactory并提供一些扩展点,如:
BeanSerializerBuilder
BeanSerializerFactory
/* /********************************************************** /* 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
MyCustomBeanSerializer
serialize(...)