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