如何根据键值定位JSONArray中的JSONObject并更新?求非遍历方案
JSONArray 定位目标 JSONObject 优化方案
核心结论
标准JSON库(比如Java常用的org.json)没有内置的按属性值查找JSONArray元素的方法,也没法直接通过经理姓名获取对应元素的索引,但可以通过工具方法或预处理优化查找逻辑,避免重复编写全量遍历代码。
1. 自定义工具方法快速查找
可以封装两个工具方法,分别用来直接获取目标JSONObject或它的索引,复用性更强:
// 根据经理姓名获取对应的JSONObject public static JSONObject getManagerByName(JSONArray managerArr, String targetName) { for (int i = 0; i < managerArr.length(); i++) { JSONObject manager = managerArr.getJSONObject(i); if (targetName.equals(manager.getString("name"))) { return manager; } } return null; // 未找到返回null } // 根据经理姓名获取对应的索引 public static int getManagerIndexByName(JSONArray managerArr, String targetName) { for (int i = 0; i < managerArr.length(); i++) { JSONObject manager = managerArr.getJSONObject(i); if (targetName.equals(manager.getString("name"))) { return i; } } return -1; // 未找到返回-1 }
使用示例:
// 找到目标经理并添加新员工 JSONObject targetManager = getManagerByName(ManagerArr, "Ram"); if (targetManager != null) { JSONArray employees = targetManager.getJSONArray("employees"); employees.put("NewEmployeeName"); }
2. 预处理转哈希表实现O(1)查找
如果需要频繁根据经理姓名查找,建议提前把JSONArray转成HashMap<String, JSONObject>,键为经理姓名,值为对应的对象,后续查找直接通过键获取,时间复杂度降为O(1):
// 预处理构建哈希表 HashMap<String, JSONObject> managerMap = new HashMap<>(); for (int i = 0; i < ManagerArr.length(); i++) { JSONObject manager = ManagerArr.getJSONObject(i); managerMap.put(manager.getString("name"), manager); } // 后续快速查找并添加员工 JSONObject targetManager = managerMap.get("Ramya"); if (targetManager != null) { targetManager.getJSONArray("employees").put("NewEmployee"); }
注意:此方法要求经理姓名唯一,如果存在重名经理,后面的对象会覆盖前面的。
内容的提问来源于stack exchange,提问作者Sahithi Y
相关产品推荐
相关产品推荐

