在父类字段上有选择地使用@JsonIgnore

时间:2018-03-13 20:13:15

标签: json serialization annotations jackson jersey

我有一个类A,它由多个类扩展,比如Class B,Class C和Class D。 但是我只希望类D在序列化期间忽略超类字段。 我该如何实现?如果我在父类@JsonIgnore上使用A注释,则所有子类都会受到影响。

1 个答案:

答案 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"}