如何基于JSONPath生成的路径字符串重命名嵌套对象的键
批量重命名深度嵌套JSON中的指定键
可行实现方案
你已经通过JSONPath获取到了所有目标键的路径数组,不需要将路径转为字符串再处理,直接基于路径数组遍历操作会更安全可靠。以下是两种实现方式:
方式一:利用JSONPath的query方法获取父节点
const jp = require('jsonpath'); const obj = { "Zone": [ { ExtWall: [ { Win: "10" } ], HVACDist: { HVACCool: [ { Win: "10" } ] } } ] }; // 获取所有Win键的完整路径 const winPaths = jp.paths(obj, '$..Win'); winPaths.forEach(path => { // 取出要重命名的旧键(路径最后一个元素) const oldKey = path.pop(); // 生成父节点的JSONPath查询语句 const parentPath = jp.stringify(path); // 获取父对象/数组 const parentNode = jp.query(obj, parentPath)[0]; // 执行重命名:新增ResWin键,赋值后删除原Win键 parentNode['ResWin'] = parentNode[oldKey]; delete parentNode[oldKey]; }); console.log(obj);
方式二:手动遍历路径获取父节点(更高效)
避免重复调用JSONPath的查询方法,自己实现路径遍历逻辑:
const jp = require('jsonpath'); const obj = { "Zone": [ { ExtWall: [ { Win: "10" } ], HVACDist: { HVACCool: [ { Win: "10" } ] } } ] }; // 遍历获取嵌套对象中的指定路径节点 function getNestedNode(root, path) { // 跳过路径开头的$,从第一个实际节点开始遍历 return path.slice(1).reduce((currentNode, key) => { return currentNode[key]; }, root); } const winPaths = jp.paths(obj, '$..Win'); winPaths.forEach(path => { const oldKey = path.pop(); const parentNode = getNestedNode(obj, path); parentNode['ResWin'] = parentNode[oldKey]; delete parentNode[oldKey]; }); console.log(obj);
两种方式最终都会将所有Win键替换为ResWin,同时保留原有的值。
问题表述优化建议
可以将提问调整得更清晰、聚焦,让读者快速理解场景和需求:
我需要把XML转换得到的深度嵌套JSON对象中,分散在多层对象与数组里的指定键
Win批量重命名为ResWin。目前已用JSONPath库获取到所有Win键的路径数组,但不确定如何利用这些路径高效完成重命名操作(比如将obj['Zone'][0]['ExtWall'][0]['Win']改为ResWin)。我尝试过把路径字符串化后替换$来访问对象,但觉得这种方式不够可靠,希望得到可行的实现方案。
优化点:
- 明确前置场景(XML转JSON的嵌套结构)
- 突出核心需求(批量重命名分散的指定键)
- 清晰说明当前尝试的方法和卡点(路径字符串化的不可靠性)
内容的提问来源于stack exchange,提问作者seth_m
相关产品推荐
相关产品推荐

