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

如何在Java中解析包含嵌套criteria对象的多层JSON结构?

Java 解析嵌套JSON中深层criteria对象的实现方案

核心问题

你现有代码的主要问题有两个:

  • 当当前JSONObject本身就包含criteria字段时(exists=true),你直接跳过了处理逻辑,没有对匹配到的criteria做解析
  • 遍历condition数组的每个条件对象时,没有检查是否存在嵌套的criteria字段,无法触发深层递归

调整后的实现代码

// 递归解析所有层级的criteria对象
public static void getKey(JSONObject json, String key) {
    // 先处理当前JSON中存在目标key的情况
    if (json.has(key)) {
        JSONObject criteria = json.getJSONObject(key);
        processCriteria(criteria);
    }
    // 遍历所有子节点继续递归查找
    Iterator<?> keys = json.keys();
    while (keys.hasNext()) {
        String nextKey = (String) keys.next();
        Object value = json.get(nextKey);
        try {
            if (value instanceof JSONObject) {
                getKey((JSONObject) value, key);
            } else if (value instanceof JSONArray) {
                JSONArray jsonArray = (JSONArray) value;
                for (int i = 0; i < jsonArray.length(); i++) {
                    Object arrayItem = jsonArray.get(i);
                    if (arrayItem instanceof JSONObject) {
                        getKey((JSONObject) arrayItem, key);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace(); // 不要留空catch块,方便排查异常
        }
    }
}

// 抽离公共的criteria处理逻辑,所有层级的criteria都走这个方法解析
private static void processCriteria(JSONObject criteria) {
    String outerLo = criteria.optString("LogicalOperator");
    System.out.println("当前criteria的逻辑运算符:" + outerLo);
    if (!criteria.has("Groups")) {
        return;
    }
    JSONArray groups = criteria.getJSONArray("Groups");
    List<CustomerPojo> list = getCustomerData(); // 测试数据统一拿取,避免重复调用
    for (int i = 0; i < groups.length(); i++) {
        JSONObject group = groups.getJSONObject(i);
        String lo = group.optString("LogicalOperator");
        if (!group.has("condition")) {
            continue;
        }
        JSONArray conditions = group.getJSONArray("condition");
        List<Object> objList = new ArrayList<>();
        System.out.println("当前Group的逻辑运算符:" + lo);
        for (int j = 0; j < conditions.length(); j++) {
            JSONObject condition = conditions.getJSONObject(j);
            // 处理当前条件的筛选逻辑
            if ("AND".equals(lo)) {
                conditionAND(objList, list, condition);
            } else if ("OR".equals(lo)) {
                conditionOR(objList, list, condition);
            }
        }
        // 去重处理
        if ("OR".equals(lo)) {
            filteringOrConditon(objList);
        }
    }
}

调整说明

  • 将criteria的解析逻辑抽成独立的processCriteria方法,不管criteria嵌套在多少层,只要匹配到就复用同一套解析逻辑,避免代码冗余
  • 遍历所有JSON节点时,不管是JSONObject还是JSONArray的子元素,都统一触发递归查找,不会遗漏深层节点
  • 所有字段读取优先用optString这类容错方法,避免字段缺失时直接抛出异常
  • 去掉了无意义的空catch块,异常会打印堆栈方便排查问题

内容的提问来源于stack exchange,提问作者Shivanand Bhangari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 15:36:02