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

des*_*pot 9 java jackson deserialization spring-social

我需要在POJO的字段上完成每个反序列化后执行一些代码.有什么方法可以通过一些杰克逊注释(或其他)策略来做到这一点吗?

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

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

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

所以我认为这也行不通.

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

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

现在实施的方式是

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

我更喜欢杰克逊的策略,因为我不需要用反射来检查POJO.它宁愿在适当的位置完成(当POJO被反序列化时).

干杯,
暴君

Sta*_*Man 5

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

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

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

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