当前位置: 首页 > 知识库问答 >
问题:

您可以按属性类型对JSON序列化进行分组吗?

武琛
2023-03-14

假设我有一个这样的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对象的键,也不允许以任何方式对类似类型进行分组。

共有2个答案

弘思聪
2023-03-14

受杰克逊的启发:如何在不修改POJO帖子的情况下将自定义属性添加到JSON中,我找到了我正在寻找的内容。它是4管齐下:

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

这没有给我额外的反射开销,我也不需要知道任何代码中的基类型。我没有丢失任何应用于由其他开发人员定义的被序列化的bean的注释(因为我使用了Jackson自己的PropertyWriters)。

我在https://github.com/drdamour/jackson-serializer-fun做了一个概念验证

廉实
2023-03-14

看来你想得到的JSON文档和2个类的结构不一样,所以不能对< code>POJO1和< code>POJO2使用绑定。但是,您可以定义一个新的类,其结构与您想要获得的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;
    }
}

然后序列化名为< code>p1的对象,该对象的类型为< code>POJO1或< code>POJO2:

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

只需将 bp 序列化为 JSON,例如使用对象映射器写值方法。此解决方案不需要 POJO1POJO2 具有公共基类。它还避免了对POJO1POJO2代码的修改。

 类似资料:
  • 问题内容: 我有一个模型如下: 我从返回: 当我检查JSON结果时,它确实包含所有,但是(和)上的属性不可见。 如何将这些值也包含在JSON序列化的对象中? 我尝试使用属性来装饰属性,但没有成功。 问题答案: 您的基本困难是JSON有两种类型的容器:对象和数组。从标准: 数组是值的有序集合。数组以(左括号)开始,以(右括号)结束。值之间用(逗号)分隔。 对象是名称/值对的无序集合。对象以(左大括号

  • 问题内容: 我想创建一个通用函数来根据传递的属性对类数组进行排序。 例如,我有这些课程 这些数组 如何为数组编写通用扩展名,以便根据传递的属性对其进行排序?(例如,persons.sort(名称)或cars.sort(制造商)) 谢谢! 问题答案: 干得好: 用法: 这是一个不变的版本: 正如Leo Dabus指出的那样,您可以将扩展名概括为以下内容:

  • 我有一个像 我有一个用户对象列表,比如:示例数据 我的问题是,如何将此列表分组以了解品牌id出现在哪些对象中,例如品牌id=10出现在所有三个对象中,品牌id=30仅出现在一个对象中 带有 key=brand id 和 value = count 的地图的结果将解决我的问题,如下所示:{10:3},{20:1},{30,1},{50,1},{80,1 }

  • 问题内容: 我想按对象的指定属性对对象列表进行排序,并希望选择用于排序的属性。例: 这个想法很简单: 我将要排序的所有值都放入一个数组中,并创建了一个映射,将这些值映射回它们的对象。对这个数组进行排序后,我将映射到这些值的对象按相同的顺序放入一个新数组中,然后按这些值对它们进行排序。这些值只是使用Object类型创建的,因此我可以按多种类型(不仅仅是示例中的Strings)进行排序。 除非您有两个

  • 我有一个类型的Java,我希望将其序列化为升序排序的JSON数组。 如果没有,我正在考虑为此目的为集合编写一个自定义序列化器--有没有更好的方法可以有人建议呢? 最终,目标是将唯一整数数组反序列化到“请求”POJO中的某种容器中。然后处理请求并将该输入字段传递到“响应”对象中的相应输出字段(未更改)。 我希望将数据以的形式存储在POJO中,以使所有用户满意(如果您试图将其存储为的子类型,那么POJ

  • 问题内容: 我想使用simplejson序列化Django模型。Django的序列化器不支持字典…,而simplejson不支持Django Querysets。这是一个难题。 在该模型中,有一个具有“外键”赞助商级别的赞助商,我试图将属于某个赞助商级别的所有赞助商分组在一起。这是生成列表的代码: 这是“制造”后的样子 我只在每个级别添加了一个赞助商,除了铜牌,只是为了展示其工作原理。我要做的就是