Java中如何过滤JSON字符串并获取子集?如何过滤JSON嵌套字段?
我来帮你搞定在Java里过滤JSON字符串(包括嵌套字段)的问题~下面两种常用方案,适配不同场景:
在Java中过滤JSON字符串并获取子集(含嵌套字段)
方法一:用Jackson的SimpleBeanPropertyFilter(需对应Java Bean)
如果你已经定义了和JSON结构匹配的Java实体类,这个方法非常顺手。先补全你没写完的代码逻辑:
首先给你的Bean加上@JsonFilter注解:
@JsonFilter("filter properties by name") public class Node { private String field1; private String field2; private String field3; // 构造器、getter/setter省略 } public class Root { private Node node1; private Node node2; // 构造器、getter/setter省略 }
然后完成完整的过滤流程:
String jsonString = "{\"node1\":{\"field1\":\"00\",\"field2\":\"test1\",\"field3\":\"test2\"},\"node2\":{\"field1\":\"00\",\"field2\":\"test123\",\"field3\":\"test456\"}}"; ObjectMapper mapper = new ObjectMapper(); // 定义要保留的字段(比如只留field1和field2) SimpleBeanPropertyFilter filter = SimpleBeanPropertyFilter.filterOutAllExcept("field1", "field2"); FilterProvider filters = new SimpleFilterProvider().addFilter("filter properties by name", filter); try { // 先把JSON反序列化为Java对象 Root root = mapper.readValue(jsonString, Root.class); // 序列化时应用过滤规则 String filteredJson = mapper.writer(filters).writeValueAsString(root); System.out.println(filteredJson); // 输出结果:{"node1":{"field1":"00","field2":"test1"},"node2":{"field1":"00","field2":"test123"}} } catch (IOException e) { e.printStackTrace(); }
要是不同嵌套节点需要不同过滤规则,给不同Bean设置专属Filter名称就行。
方法二:用Jackson的Tree Model(无需Java Bean,灵活处理嵌套)
如果没预先定义实体类,直接操作JsonNode会更灵活,特别适合动态过滤多层嵌套的场景:
String jsonString = "{\"node1\":{\"field1\":\"00\",\"field2\":\"test1\",\"field3\":\"test2\"},\"node2\":{\"field1\":\"00\",\"field2\":\"test123\",\"field3\":\"test456\"}}"; ObjectMapper mapper = new ObjectMapper(); try { JsonNode rootNode = mapper.readTree(jsonString); // 创建空的ObjectNode存放过滤结果 ObjectNode filteredRoot = mapper.createObjectNode(); // 遍历顶层节点(node1、node2) rootNode.fields().forEachRemaining(entry -> { String nodeName = entry.getKey(); JsonNode childNode = entry.getValue(); // 给每个嵌套节点过滤字段,比如只留field1和field3 ObjectNode filteredChild = mapper.createObjectNode(); if (childNode.has("field1")) { filteredChild.set("field1", childNode.get("field1")); } if (childNode.has("field3")) { filteredChild.set("field3", childNode.get("field3")); } filteredRoot.set(nodeName, filteredChild); }); // 转换为格式化后的JSON字符串 String filteredJson = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(filteredRoot); System.out.println(filteredJson); // 输出结果: // { // "node1" : { // "field1" : "00", // "field3" : "test2" // }, // "node2" : { // "field1" : "00", // "field3" : "test456" // } // } } catch (IOException e) { e.printStackTrace(); }
如果嵌套层级更深,只要递归遍历JsonNode就能实现深层过滤。
额外技巧:自定义复杂过滤规则
要是需要根据字段值过滤这类复杂逻辑,可以扩展SimpleBeanPropertyFilter:
SimpleBeanPropertyFilter customFilter = new SimpleBeanPropertyFilter() { @Override protected boolean include(BeanPropertyWriter writer) { // 保留field1,且field2的值不等于"test1"时才保留field2 if ("field1".equals(writer.getName())) { return true; } if ("field2".equals(writer.getName())) { try { Object value = writer.get(null); // 实际使用时传入对应Bean对象 return !"test1".equals(value); } catch (Exception e) { return false; } } return false; } };
内容的提问来源于stack exchange,提问作者gk.
相关产品推荐
相关产品推荐

