如何在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
相关产品推荐
相关产品推荐

