我需要在POJO的字段上完成每个反序列化后执行一些代码。 有什么方法可以通过杰克逊注释(或其他)策略来做到这一点吗?
一种方法是为每个字段类型创建一个自定义反序列化器,它将实现PostLogicDeserializerInterface或扩展一些PostLogicDeserializerAbstract。但这会使大量难以维护的代码变得混乱(而不仅仅是使用@JsonProperty)。所以我认为这不是一个好主意。
我看到你可以在类级别使用@JsonDeserialize,但只能用于值类。来自文档:
当注释值类时,配置用于值类的实例,但可以被更具体的注释(附加到方法或字段的注释)覆盖。
所以我认为这也行不通。
我的目标是确定反序列化程序设置的字段百分比。我需要有一个计数器,它会在每次调用的反序列化(填充字段)时增加。一旦整个类(POJO)反序列化结束,我需要使用反射执行一些逻辑。
我现在实施的方式是
我更喜欢杰克逊的策略,因为我不需要用反射检查POJO。它宁愿在适当的位置完成(在POJO被反序列化时)。
干杯,
霸
答案 0 :(得分:4)
此时没有任何特定功能可以进行后处理或预处理;而这种接近数据绑定应该做的界限。 如果我必须为特定字段执行此操作,我可能只需将其添加到setter中,因为这很简单,可以做和工作;但在所有相关的制定者中都需要相同的逻辑。
@JsonDeserialize也可用于单个属性(字段,设置器),因此您可以创建自定义反序列化器:并且由于您需要进行后处理,您可以只找到“真正的”反序列化器(理想情况下通过制作{{1}实现JsonDeserializer
或ContextualDeserializer
- 这可能无关紧要,但对于一般情况,这里是为了避免循环依赖的问题),委托它,并修改值。这假设它比你更关心的是值。
最后,还有一些方法可以修改ResolvableDeserializer
个实例(通过注册BeanDeserializer
) - 您可以将相关组件(SettableBeanProperty,我认为......)子类化以挂钩其他处理,或者甚至替换要使用的反序列化器,保持对原始“默认”反序列化器的引用。
但最后,你的情况听起来像是最好由其他东西处理的东西:例如Bean Validation API(jsr-303)似乎是后处理逻辑的潜在良好匹配。由于它与数据绑定有些正交,因此它可能是一个更好的选择,因为它独立于数据绑定(jackson),可重用,所有好东西。
答案 1 :(得分:0)
另一种方法是使用@JsonCreator
标记将接收数据的构造函数。在构造函数内部,您可以完全控制如何将它们分配给字段。