我有一个类A
,它由多个类扩展,比如Class B
,Class C
和Class D
。
但是我只希望类D
在序列化期间忽略超类字段。
我该如何实现?如果我在父类@JsonIgnore
上使用A
注释,则所有子类都会受到影响。
答案 0 :(得分:0)
我可以看到两种方式:
1 - 您可以使用JacksonAnnotationIntrospector
来动态忽略字段,在这里我们测试该字段是否来自类A
(请参阅下面的序列化类C
时的示例)
class CustomIntrospector extends JacksonAnnotationIntrospector {
@Override
public boolean hasIgnoreMarker(final AnnotatedMember m) {
return m.getDeclaringClass() == A.class;
}
}
2 - 您可以使用@JsonIgnoreProperties
注释忽略您不想要的字段(请参阅下面有关课程D
定义的示例)
然后使用以下课程
class A {
public String fieldA = "a";
}
class B extends A {
public String fieldB = "b";
}
class C extends A {
public String fieldC = "c";
}
@JsonIgnoreProperties(value = { "fieldA" })
class D extends A {
public String fieldD = "d";
}
然后使用ObjectMapper
public static void main(String[] args) throws Exception {
A a = new A();
String jsonA = new ObjectMapper().writeValueAsString(a);
System.out.println(jsonA);
// No filtering, will output all fields
B b = new B();
String jsonB = new ObjectMapper().writeValueAsString(b);
System.out.println(jsonB);
// Using the CustomIntrospector to filter out fields from class A
C c = new C();
ObjectMapper mapper = new ObjectMapper().setAnnotationIntrospector(new CustomIntrospector());
String jsonC = mapper.writeValueAsString(c);
System.out.println(jsonC);
// Using @JsonIgnoreProperties to filter out fields from class A
D d = new D();
String jsonD = new ObjectMapper().writeValueAsString(d);
System.out.println(jsonD);
}
输出
{"fieldA":"a"}
{"fieldA":"a","fieldB":"b"}
{"fieldC":"c"}
{"fieldD":"d"}