我正在为我的应用程序开发一个REST接口,使用Jackson将我的POJO域对象序列化为JSON表示.我想为某些类型自定义序列化,以便为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();
}
Run Code Online (Sandbox Code Playgroud)
或者(甚至更好)在jgen.writeEndObject()调用之前以某种方式拦截序列化,例如:
@Override void beforeEndObject(....) {
jgen.writeObjectField("my_extra_field", "some data");
}
Run Code Online (Sandbox Code Playgroud)
我以为我可以扩展BeanSerializer和覆盖它的serialize(..)方法,但是它被声明了final,而且我找不到一种简单的方法来创建一个新的实例BeanSerializer而不提供所有类型的元数据细节实际上复制了杰克逊的一部分.所以我放弃了这样做.
我的问题是 - 如何定制Jackson的序列化,为特定POJO的JSON输出添加额外的东西,而不会引入太多的样板代码并尽可能多地重用默认的Jackson行为.
有一种Spring方法可以过滤掉带有JSON视图的服务响应中的字段,但是缺少一种等效的方法来丰富具有这样的动态/同步字段的响应;
class User{
getFirstName(){...}
getLastName(){...}
getCreateDate(){...}
}
class UserViewA{
getFullName(){
return getLastName()+", "+getFirstName()
}
getCreateDate(){...}
}
class UserViewB{
getFullName(){
return getFirstName()+" "+getLastName()
}
getCreateDate(){...}
}
Run Code Online (Sandbox Code Playgroud)
我可以将用户包装在视图中,但我不想手动传播所有需要的用户字段.
我的另一个想法是使用用户对象扩展视图并创建某种引用链接器以将用户对象的值引用复制到视图,但这会使集合变得复杂.
是否有其他方法或框架来实现这一目标?这个概念根本没有得到解决吗?
更新:
通过示例澄清:
我正在寻找一种外观解决方案/框架/方法.
在序列化为JSON时,我需要向对象添加新属性.属性的值是在运行时计算的,并且在对象中不存在.同样的对象也可以用于创建具有不同set ot字段的不同JSON(具有子类的基类,但我不想仅为JSON生成创建一个).
这样做的最佳方法是什么,这不涉及创建自定义序列化程序类,它将负责整个对象字段的序列化?或者可能继承一些"基本"序列化器,只需将其输出并以某种方式添加新字段?
我了解了mixins,看起来可以重命名/隐藏一些字段,但似乎无法添加额外的字段.
我正在尝试创建会影响序列化值的自定义jackson注释.
含义:
class X {
@Unit("mm") int lenght;
...
}
Run Code Online (Sandbox Code Playgroud)
现在序列化对象X(10)会导致:
{
"lenght" : "10 mm"
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?