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

时间:2011-04-02 10:32:21

标签: java jackson deserialization spring-social

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

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

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

  3.   

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

    所以我认为这也行不通。

    1. 在POJO setter方法中使用一些自定义逻辑是一种不好的做法!而另一方面,我认为杰克逊无论如何都会使用反射来设置字段...这不是一个好策略。
    2. 我的目标是确定反序列化程序设置的字段百分比。我需要有一个计数器,它会在每次调用的反序列化(填充字段)时增加。一旦整个类(POJO)反序列化结束,我需要使用反射执行一些逻辑。

      我现在实施的方式是

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

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

      干杯,

2 个答案:

答案 0 :(得分:4)

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

@JsonDeserialize也可用于单个属性(字段,设置器),因此您可以创建自定义反序列化器:并且由于您需要进行后处理,您可以只找到“真正的”反序列化器(理想情况下通过制作{{1}实现JsonDeserializerContextualDeserializer - 这可能无关紧要,但对于一般情况,这里是为了避免循环依赖的问题),委托它,并修改值。这假设它比你更关心的是值。

最后,还有一些方法可以修改ResolvableDeserializer个实例(通过注册BeanDeserializer) - 您可以将相关组件(SettableBeanProperty,我认为......)子类化以挂钩其他处理,或者甚至替换要使用的反序列化器,保持对原始“默认”反序列化器的引用。

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

答案 1 :(得分:0)

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