JSON 序列化程序将 className 添加为使用 jackson objectMapper

我正在尝试添加一个新字段,指定我的 json 响应中所有对象的类名。 我从 EJB 服务响应中获取对象。该对象的类型为 Object。对象可以包含任何内容 - 原始类型成员变量、原始包装列表、引用列表/集合、任何类型的映射。

得到响应后,我使用 jackson object mapper 将此对象转换为 JSON 并发送给客户端。

但是,我希望我的对象(我正在将其转换为 JSON)中的任何对象(即原始包装之外的引用) - 无论是 List 中的一个对象,Map 中的一个对象,在任何地方都有一个新字段作为“ type" 指定对象类名以及在 Json 响应中转换为 Json 对象后的对象类名。

例如: 使用对象映射器将我的对象转换为 json 后,我得到了这个 JSON 响应。我只知道这个对象的类。

{
"values": [{i: 10},{i: 20,anotherSubClassOfAField: 25}],#Comment  => List of implementation objects of some class or interface A.
"mapvalues" : {"val1" : "hello","val2" : [{j: 30},{j: 10,anotherSubClassOfBField: "Hello"}] # Comment: List of implementation objects of some class or interface B. },"name" : "Test"
} 

我希望输出序列化为:

{
"values": [{i: 10,"type" : class name of class AChild1 implements/extends A},anotherSubClassOfAField: 25,"type" : class name of class AChild2 implements/extends A}],"mapvalues" : {"val1" : "hello","val2" : [{j: 30,"type": class name of class BChild1 implements/extends B},anotherSubClassOfBField: "Hello","type" : class name of class BChild2 implements/extends B}]},"name" : "Test","type": class name of parent object which I already know.
} 

到目前为止我做了什么?

如前所述,我知道父类的类名,如果我将对象转换为映射,则遍历其键并获取值,这些值可以是基元列表、对象、对象列表、 map 而键是所有的 String 值,我可以通过递归遍历它,直到找不到最里面的对象。此外,从好的方面来说,如果找到了一个对象,我也可以很容易地知道它的类。所以,我可以知道父对象中所有对象的类,但我必须遍历转换为映射的父对象。

遇到一个对象后,我将其转换为地图并再次重复与上述相同的过程,一旦完成,我将类型字段添加到其中。

所以,最后,我将有一个地图对象,我只需要使用对象映射器将其转换为 JSOn 并发送给客户端。

但是,这种递归方法似乎太琐碎了。我知道还有一个 JsonSerializer 。我看到很多帖子都在使用它,但都提到在 Json 响应中的对象中添加一个具有相同值的额外字段。

有什么办法可以使用它来实现它吗?

P.S:BlazeDS 中存在类似的功能。

kay3320 回答:JSON 序列化程序将 className 添加为使用 jackson objectMapper

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/30111.html

大家都在问