如何让Jackson序列化时跳过指定字段且不修改POJO
解决Jackson动态排除POJO字段的方案
方法一:用SimpleBeanPropertyFilter实现灵活过滤
这种方案完全不需要修改原POJO,能随时切换要排除或保留的字段,最符合你的需求。
操作步骤:
- 先定义一个Mix-in类,用来给原POJO绑定过滤器标识(不用改动原POJO代码):
@JsonFilter("myPojoFilter") abstract class MyPojoMixIn {}
- 配置ObjectMapper并应用过滤器:
ObjectMapper mapper = new ObjectMapper(); // 将Mix-in与原POJO类关联 mapper.addMixIn(MyPojo.class, MyPojoMixIn.class); // 创建过滤器:排除sub字段,其他字段正常序列化 SimpleBeanPropertyFilter excludeSubFilter = SimpleBeanPropertyFilter.serializeAllExcept("sub"); FilterProvider filterProvider = new SimpleFilterProvider().addFilter("myPojoFilter", excludeSubFilter); // 执行序列化 MyPojo pojo = new MyPojo(); pojo.setName("john"); pojo.setAge("21"); String json = mapper.writer(filterProvider).writeValueAsString(pojo); // 输出结果:{"name":"john","age":"21"}
要切换过滤规则的话,直接修改过滤器即可:
- 排除age、保留sub:
SimpleBeanPropertyFilter excludeAgeFilter = SimpleBeanPropertyFilter.serializeAllExcept("age");
- 只保留name和sub字段:
SimpleBeanPropertyFilter onlyNameSubFilter = SimpleBeanPropertyFilter.filterOutAllExcept("name", "sub");
方法二:用ObjectWriter直接指定字段(Jackson 2.10+)
如果你的Jackson版本在2.10及以上,用ObjectWriter的exclude/include方法更简洁,连Mix-in都不需要:
ObjectMapper mapper = new ObjectMapper(); MyPojo pojo = new MyPojo(); pojo.setName("john"); pojo.setAge("21"); // 排除sub字段 String json = mapper.writer() .exclude(MyPojo.class, "sub") .writeValueAsString(pojo); // 切换为排除age字段 String jsonExcludeAge = mapper.writer() .exclude(MyPojo.class, "age") .writeValueAsString(pojo);
方法三:全局忽略null字段(仅适用于null值场景)
如果你的需求只是去掉值为null的字段(比如示例中的sub为null),直接给ObjectMapper加全局配置即可:
ObjectMapper mapper = new ObjectMapper(); // 仅序列化非null的字段 mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); MyPojo pojo = new MyPojo(); pojo.setName("john"); pojo.setAge("21"); String json = mapper.writeValueAsString(pojo); // 输出结果:{"name":"john","age":"21"}
不过这种方式只能处理null值字段,无法灵活排除非null字段,适合特定场景使用。
内容的提问来源于stack exchange,提问作者Geeth
相关产品推荐
相关产品推荐

