java - 杰克逊按名称忽略子树外的字段
问题描述
我有一个如下的类结构(简化版本):
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
字段,并且被序列化的类是自动生成的。
解决方案
在字段上使用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" : { }
}
也可以看看:
推荐阅读
- c# - .net 核心中的 IHttpClientFactory
- postgresql - PostgreSQL 11 中的表分区与自动分区创建?
- html - 密码与 Angular CLI 中的模式不匹配
- arcgis - 在哪里可以找到 ArcGIS 服务 url 以及如何创建?如何从服务器上传和查看内容
- spring-boot - jasypt-spring-boot-starter:密码不是 ascii
- vba - 如何检查重复名称,但避免自行激活
- java - 如何将我的一个片段数据传递给同一活动中的另一个片段?
- ruby-on-rails - Select2 没有在下拉菜单中显示搜索选项?
- javascript - 如何从父类别中排除特定的子类别帖子?
- javascript - 从数组中拆分具有多个分隔符的字符串