如何根据路径格式数据高效更新嵌套JSON且不覆盖已有字段
嵌套JSON指定路径更新方案
核心逻辑
JSONObject为引用传递类型,只需遍历到目标字段的上一级父对象,直接调用put方法更新目标字段即可,无需重构上层结构,不会丢失同层级其他字段。
实现步骤
- 拆分接收的消息,按
=分割为路径部分和目标值部分,限制拆分2次避免值中包含=导致解析错误 - 将路径部分按
/分割为层级数组,数组最后一个元素为待更新的目标字段名,其余元素为父级嵌套路径 - 遍历父级嵌套路径,逐层获取对应层级的JSONObject,不存在的层级可按你的现有逻辑创建
- 最终获取到目标字段的父对象后,直接调用
put方法写入目标字段和新值即可完成更新
完整代码示例
import org.json.JSONObject; public class NestedJsonUpdater { public static void main(String[] args) { // 原始JSON示例,包含同层级其他字段pqr String originJson = "{\"root\":{\"abc\":{\"xyz\":\"oldVal\",\"pqr\":\"keepMe\"}}}"; // 接收的消息示例 String receiveMsg = "abc/xyz=yo"; // 拆分消息为路径和目标值 String[] msgSplit = receiveMsg.split("=", 2); String pathStr = msgSplit[0]; String targetVal = msgSplit[1]; // 拆分路径为层级数组 String[] pathLevels = pathStr.split("/"); int totalLevel = pathLevels.length; JSONObject mainObj = new JSONObject(originJson); // 从root节点开始遍历 JSONObject currentParent = mainObj.getJSONObject("root"); // 遍历到目标字段的上一级父节点 for (int i = 0; i < totalLevel - 1; i++) { String currentLevelKey = pathLevels[i]; // 可在此处添加层级不存在时的创建逻辑,你已具备该能力故省略 currentParent = currentParent.getJSONObject(currentLevelKey); } // 直接更新目标字段,不影响其他字段 String targetKey = pathLevels[totalLevel - 1]; currentParent.put(targetKey, targetVal); // 输出验证结果 System.out.println(mainObj.toString(2)); } }
运行结果验证
执行后输出的JSON如下,可见pqr字段保留,xyz已成功更新为新值:
{ "root": { "abc": { "xyz": "yo", "pqr": "keepMe" } } }
兼容说明
该逻辑天然兼容单层路径场景,例如输入消息为rootKey=test时,循环不会执行,直接在root节点更新对应字段即可。
内容的提问来源于stack exchange,提问作者Sandip
相关产品推荐
相关产品推荐

