繁体   English   中英

是否有任何 jackson json 策略(使用注释或其他方式),将在字段的反序列化之前和之后执行一些逻辑?

[英]Is there any jackson json strategy (using annotations or another way), that will execute some logic prior and post deserialization of field?

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

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

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

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

所以我认为这也行不通。

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

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

现在实施的方式是

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

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

干杯,
暴君

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

@JsonDeserialize也可用于单个属性(场,二传手),所以你可以创建一个自定义解串器:既然你想后处理,你可能只是找到“真正的”解串器(最好是通过使JsonDeserializer实现要么ContextualDeserializerResolvableDeserializer - - 这在这里可能无关紧要,但对于一般情况,在此处完成以避免循环依赖问题),委托给它并修改值。 这假设您关心的是价值而不是领域。

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

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

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

暂无
暂无

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

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