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

如何编辑和新增JSON文件中的嵌套数据,实现存在更新不存在新增?

嵌套JSON路径增量更新/新增实现方案

核心逻辑

  • 拆分用户输入:用=将输入字符串拆分为路径段和目标值两部分,再将路径段按/切割为层级数组,例如输入abc/xyz/pq=ayo会被拆分为路径数组['abc', 'xyz', 'pq'],值为ayo
  • 逐层定位节点:从JSON根节点出发,遍历路径数组中除最后一个元素外的所有层级
    • 若当前层级不存在对应key,直接初始化该key为空白对象
    • 若当前层级存在对应key,直接复用该对象进入下一层
  • 执行赋值:遍历到倒数第二层后,直接将最后一个路径key对应的值设置为目标值,自动覆盖原有值(更新场景)或新增key(新增场景)

代码示例(JavaScript)

// 示例现有JSON结构,已移除冗余数组,符合RFC8259标准
let jsonData = {
  root: {
    abc: {
      xyz: {
        pq: "yo"
      }
    }
  }
}

/**
 * 根据输入的路径更新JSON结构
 * @param {string} inputStr 输入的路径+值字符串,格式如abc/xyz/pq=yo
 * @param {object} rootObj JSON根操作节点,默认取jsonData的root字段
 * @returns {object} 更新后的完整JSON对象
 */
function updateJsonByPath(inputStr, rootObj = jsonData.root) {
  // 拆分路径与目标值
  const [pathStr, targetValue] = inputStr.split('=');
  const pathArr = pathStr.split('/');
  // 层级遍历指针
  let currentNode = rootObj;

  // 遍历到倒数第二层节点
  for (let i = 0; i < pathArr.length - 1; i++) {
    const currentKey = pathArr[i];
    // 不存在对应key则初始化空对象
    if (!currentNode[currentKey]) {
      currentNode[currentKey] = {};
    }
    // 指针移动到下一层
    currentNode = currentNode[currentKey];
  }

  // 最后一层赋值,自动实现更新/新增
  const lastKey = pathArr.at(-1);
  currentNode[lastKey] = targetValue;

  return jsonData;
}

// 测试用例1:更新已存在路径
updateJsonByPath('abc/xyz/pq=ayo');
// 执行后jsonData.root.abc.xyz.pq的值变为ayo

// 测试用例2:新增不存在路径
updateJsonByPath('abc/xyz/lm=ayo');
// 执行后jsonData.root.abc.xyz下新增lm字段,值为ayo

说明

  • 不需要全量遍历JSON结构,仅按输入路径遍历对应层级,时间复杂度为O(n),n为路径层级深度,性能消耗极低
  • 若需要支持数组类型的子节点,可扩展路径匹配逻辑,例如识别abc/arr[1]=test格式的输入,初始化对应数组结构即可
  • 持久化到文件时,直接将更新后的jsonData序列化后覆盖原文件即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 08:18:02