繁体   English   中英

能否按属性类型对JSON序列化进行分组

[英]Can you group JSON serialization by property Type

假设我有一个像这样的POJO:

class POJO1 {
   TypeA getFirst();
   TypeA getSecond();
   TypeB getThird();
   String getName();
}

我正在寻找一个将输出以下内容的自定义序列化程序:

{ "A" : [ serializationOf(first), serializationOf(second) ], "B" : serializationOf(second), "name" : valueOfName() }

但这是要抓住的地方,它并不特定于POJO1。 这意味着对于另一个POJO也会发生相同的序列化:

class POJO2 {
   TypeA getFirst();
   TypeA getSecond();
   TypeB getThird();
   String getName();
}

或具有TypeA或TypeB属性的任何类,这意味着方法可以更改。 我宁愿不要以基类或接口为目标,因为开发我从未想过的其他类的人会使用我的序列化器。 我一直在寻找注册TypeA和TypeB序列化器,但它们似乎不允许我更改json对象的键,也无法以任何方式对相似类型进行分组。

似乎要获取的JSON文档与2个类的结构不同,因此不能对POJO1POJO2使用绑定。 但是,您可以定义一个具有与想要获取的JSON相同结构的新类。 例如

class BindedPojo {
    TypeA[] A;
    TypeA B;
    String name;

    BindedPojo(TypeA a, TypeA b, String n) {
        A = new TypeA[]{a, b};
        B = b;
        name = n;
    }
}

然后序列化一个类型为POJO1POJO2名为p1的对象:

BindedPojo bp = new BindedPojo(p1.getFirst(), p1.getSecond(), p1.getName());

只需使用ObjectMapperwriteValue方法将bp序列化为JSON。 此解决方案不需要POJO1POJO2具有公共基类。 它还避免了对POJO1POJO2的源代码的修改。

Jackson的启发:如何在不修改POJO帖子的情况下向JSON添加自定义属性,我找到了我想要的东西。 这是4叉:

  • 添加一个过滤器,以删除我要分组的所有类型
  • 使该过滤器适用于我关心的容器类型(以我的情况为对象)
  • 添加一个自定义序列化程序,该序列化程序使用链接的答案中的技术扩展BeanSerializerBase
  • 使用受保护的_props:BeanWriter []在该扩展BeanSerializerBase中添加自定义组序列化代码

这使我没有任何额外的反射开销,并且我不必知道任何代码中的基本类型。 我不会丢失任何被其他开发者定义为序列化的bean所应用的注释(因为我使用Jackson自己的PropertyWriters)。

我在https://github.com/drdamour/jackson-serializer-fun上整理了POC

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM