如何编辑和新增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
相关产品推荐
相关产品推荐

