Jackson序列化:如何忽略超类属性

我想序列化一个不受我控制的POJO类,但是想避免序列化任何来自超类而不是最终类的属性。例:

public class MyGeneratedRecord extends org.jooq.impl.UpdatableRecordImpl<...>,

example.generated.tables.interfaces.IMyGenerated {

public void setField1(...);

public Integer getField1();

public void setField2(...);

public Integer getField2();

...

}

您可以从示例中猜测到,该类是由JOOQ生成的,并且是从复杂的基类UpdatableRecordImpl继承的,该基类还具有一些类似于bean属性的方法,这会在序列化过程中引起问题。另外,我有几个类似的类,因此最好避免对所有生成的POJO复制相同的解决方案。

到目前为止,我已经找到以下可能的解决方案:

  • 使用如下混合方法忽略超类的特定字段:如何告诉杰克逊忽略无法控制源代码的属性?

这样做的问题是,如果基类发生更改(例如,其中出现了新的getAnything()方法),则它可能会破坏我的实现。

  • 实现自定义序列化程序并在那里处理问题。对我来说,这似乎有些矫kill过正。

  • 顺便说一句,我有一个接口准确描述了我要序列化的属性,也许我可以混入@JsonSerialize(as = IMyGenerated.class)批注…?我可以将其用于我的目的吗?

但是,从纯粹的设计角度来看,最好的办法是能够告诉杰克逊,我只想序列化最后一个类的属性,而忽略所有继承的属性。有没有办法做到这一点?

提前致谢。

回答:

您可以注册一个自定义的Jackson注释Intropector,它将忽略来自某种超级类型的所有属性。这是一个例子:

public class JacksonIgnoreInherited {

public static class Base {

public final String field1;

public Base(final String field1) {

this.field1 = field1;

}

}

public static class Bean extends Base {

public final String field2;

public Bean(final String field1, final String field2) {

super(field1);

this.field2 = field2;

}

}

private static class IgnoreInheritedIntrospector extends JacksonAnnotationIntrospector {

@Override

public boolean hasIgnoreMarker(final AnnotatedMember m) {

return m.getDeclaringClass() == Base.class || super.hasIgnoreMarker(m);

}

}

public static void main(String[] args) throws JsonProcessingException {

final ObjectMapper mapper = new ObjectMapper();

mapper.setAnnotationIntrospector(new IgnoreInheritedIntrospector());

final Bean bean = new Bean("a", "b");

System.out.println(mapper

.writerWithDefaultPrettyPrinter()

.writeValueAsString(bean));

}

}

输出:

{“ field2”:“ b”}

以上是 Jackson序列化:如何忽略超类属性 的全部内容, 来源链接: utcz.com/qa/421068.html

回到顶部