12

在对 POJO 的字段进行每次反序列化后,我需要执行一些代码。有什么办法可以通过一些杰克逊注释(或其他)策略来做到这一点?

  1. 一种方法是为每个字段类型创建一个自定义反序列化器,以实现 PostLogicDeserializerInterface 或扩展一些 PostLogicDeserializerAbstract。但这会产生大量难以维护的杂乱代码(而不仅仅是使用@JsonProperty)。所以我认为这不是一个好主意。

  2. 我看到您可以在类级别使用@JsonDeserialize,但只能用于值类。从文档中:

注释值类时,配置用于值类的实例,但可以被更具体的注释(附加到方法或字段的注释)覆盖。

所以我认为这也行不通。

  1. 在 POJO 的 setter 方法中使用一些自定义逻辑是一种不好的做法!另一方面,我认为杰克逊无论如何都使用反射来设置字段......也不是一个好策略。

我的目标是确定反序列化程序设置的字段百分比。我需要有一个计数器,在每次调用反序列化(填充字段)时都会增加。一旦整个类(POJO)反序列化结束,我需要使用反射执行一些逻辑。

现在实施的方式是

  • 一旦我让杰克逊映射器反序列化 POJO,我就会使用反射遍历每个字段
  • 检查它是否已设置,如果它是 null 或 -1 用于原始数字(以前的初始值)。(这种方法的一个缺点是如果设置了布尔值,您将无法检查它)
  • 使用反射进行其他类型的检查(我们称之为逻辑 X)
  • 执行取决于设置字段百分比和逻辑 X 的逻辑。

我更喜欢杰克逊策略,因为我不需要通过反射检查 POJO。它宁愿在原地完成(在 POJO 反序列化时)。

干杯,
暴君

4

2 回答 2

5

此时没有任何特定的功能可以进行后处理或预处理。这种接近于数据绑定应该做的边界。如果我必须为特定字段执行此操作,我可能只会将其添加到 setter 中,因为这很简单并且有效;但在所有相关的设置器中都需要相同的逻辑。

@JsonDeserialize 也可以用于单个属性(字段、设置器),因此您可以创建一个自定义反序列化器:并且由于您想要后处理,您可以找到“真正的”反序列化器(理想情况下通过JsonDeserializer实现ContextualDeserializer或者ResolvableDeserializer- 这可能在这里无关紧要,但对于一般情况,这里是为了避免循环依赖的问题),委托给它,并修改值。这假设它是您关心的价值而不是字段。

最后,还有一些修改BeanDeserializer实例的方法(通过注册BeanDeserializerModifier)——你可以对相关组件(我认为是 SettableBeanProperty ......)进行子类化以挂钩额外的处理,甚至替换反序列化器来使用,保持对原始的引用“默认”反序列化器。

但最后,您的案例听起来可能最好由其他东西处理:例如 Bean Validation API (jsr-303) 似乎是后处理逻辑的潜在好匹配。由于它与数据绑定有些正交,它可能是一个更好的选择,因为它独立于数据绑定(杰克逊),可重用,所有好东西。

于 2011-04-02T18:14:04.553 回答
0

另一种方法是使用@JsonCreator标记将接收数据的构造函数。在构造函数中,您可以完全控制如何将它们分配给字段。

于 2020-12-13T09:52:13.120 回答