You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:12:42