首页 > 解决方案 > 杰克逊按名称忽略子树外的字段

问题描述

我有一个如下的类结构(简化版本):

public class A {
    public int a;
    public B b;
    public C c;
    public D d;
    public E e;
}

public class B {
    public int a;
}

public class C {
    public int a;
    public D d;
}

public class D {
    public int a;
}

public class E {
    public int a;
}

在序列化A时,我想删除除子树下a包含的类之外的所有类的字段C。这意味着我想将a字段保留在C实例和D实例中(但仅限于 下的那个C)。我希望我很清楚。

我尝试使用 MixIns 或提供自定义序列化程序,但无法实现我想要的。

请注意,实际上有太多的类,包括a字段,并且被序列化的类是自动生成的。

标签: javajsonserializationfilterjackson

解决方案


在字段上使用JsonFilter注释。您可以通过MixIn功能注册它并启用给定的类型和getter方法。见下面的代码:

import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
import com.fasterxml.jackson.annotation.JsonFilter;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;
import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;

public class JsonApp {

    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        mapper.enable(SerializationFeature.INDENT_OUTPUT);
        mapper.addMixIn(A.class, AMixIn.class);

        SimpleFilterProvider filterProvider = new SimpleFilterProvider()
            .addFilter("excludeA", SimpleBeanPropertyFilter.serializeAllExcept("a"));

        mapper.setFilterProvider(filterProvider);

        System.out.println(mapper.writeValueAsString(new A()));
    }
}

@JsonFilter("excludeA")
interface AMixIn {

    @JsonFilter("excludeA")
    B getB();

    @JsonFilter("excludeA")
    D getD();

    @JsonFilter("excludeA")
    E getE();
}

对于POJO上面代码打印的模型:

{
  "b" : { },
  "c" : {
    "a" : 3,
    "d" : {
      "a" : 4
    }
  },
  "d" : { },
  "e" : { }
}

也可以看看:


推荐阅读