通过Feature File更新JSON元素时生成额外元素的技术问题
解决动态传入嵌套JSON属性路径导致的额外元素问题
看起来你碰到了一个很常见的动态访问嵌套JSON属性的坑——硬编码属性路径时一切正常,但通过Feature File传入字符串形式的路径时,JS会把整个路径当成一个全新的顶层属性,自然就生成了额外元素。
问题根源
当你直接写tempJSON.customer.personalDetails.customerFullName = "Amanda"时,JS会逐层解析.分隔的属性,精准找到嵌套的customerFullName并赋值。但如果从Feature File传入的是类似"customer.personalDetails.customerFullName"的字符串,你要是直接用tempJSON[propertyPath] = "Amanda",JS会认为你要给tempJSON新增一个名为customer.personalDetails.customerFullName的顶层属性,而不是去访问嵌套的层级。
解决方案:编写嵌套属性赋值工具函数
我们需要把传入的字符串路径拆分成单个属性名,然后逐层遍历JSON对象,最后给目标属性赋值。
首先定义一个工具函数:
function setNestedProperty(obj, path, value) { // 将路径按`.`拆分成属性名数组 const keys = path.split('.'); let currentLayer = obj; // 遍历到倒数第二个属性,确保每一层对象都存在 for (let i = 0; i < keys.length - 1; i++) { const key = keys[i]; // 如果当前层级没有这个属性,创建空对象(可根据需求改为抛出错误) if (!currentLayer[key]) { currentLayer[key] = {}; } currentLayer = currentLayer[key]; } // 给最后一个属性赋值 currentLayer[keys[keys.length - 1]] = value; }
然后修改你的代码,集成这个工具函数(假设从Feature File传入的属性路径存在targetProperty变量中):
await (function replaceJSONData(callback) { fs.readFile(requestPath, 'utf8', function (err, data) { if (err) { callback(err); // 别忘了处理文件读取错误 return; } var tempJSON = JSON.parse(data); // 这里替换成从Feature File传入的属性路径变量 const targetProperty = "customer.personalDetails.customerFullName"; const newValue = "Amanda"; // 使用工具函数赋值 setNestedProperty(tempJSON, targetProperty, newValue); console.log(tempJSON); // 重要:将修改后的JSON写回文件(原代码缺少这一步) fs.writeFile(requestPath, JSON.stringify(tempJSON, null, 2), (writeErr) => { callback(writeErr); }); }); });
额外注意事项
- 确保从Feature File传入的路径格式正确,必须是用
.分隔的嵌套属性字符串,比如"customer.personalDetails.customerFullName" - 如果路径中的某个层级原本不存在,工具函数会自动创建空对象;如果你希望这种情况抛出错误,可以把
currentLayer[key] = {}改成throw new Error(Missing property ${key} in path) - 原代码只修改了内存中的JSON对象,没有写回文件,记得加上
fs.writeFile步骤才能真正更新JSON文件
内容的提问来源于stack exchange,提问作者Poc
相关产品推荐
相关产品推荐

