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

嵌套序列化JSON解析出现多余数字键值对,如何修复现有实现?

问题根因

  • 错误出在addValuesToObject的返回值使用逻辑:该函数最终返回的是嵌套路径最后一级对应的值,而非完整新对象。
  • 当路径长度为1时(比如处理顶级keyvalue2对应的值"NO"),函数返回值就是字符串"NO",执行{ ...newObject, ...newEntry }时,JS会自动把字符串转成类数组对象展开,就产生了多余的0: "N"、1: "O"这类数字键。
  • 且addValuesToObject本身已经直接修改了传入的newObject原对象,完全不需要再做展开赋值的操作,这行多余的赋值才是问题的核心来源。

修复方案

只需要修改nestedJsonParser里else分支的逻辑,删掉多余的展开赋值即可,修改后的完整代码如下:

const addValuesToObject = ({ object, keysArray, value }) => {
    for (let i = 0; i < keysArray.length; i++) {
       const lastKey = i === keysArray.length - 1;
       object = object[keysArray[i]] = object[keysArray[i]] || (lastKey ? value : {});
    }
    return object;
 };

 const isStringifiedObject = (value) => typeof value === "string" && value[0] === "{" && value[value.length - 1] === "}";

 const nestedJsonParser = (stringifiedObject) => {
        
    if (!stringifiedObject) return {};

    let newObject = {};

    const parser = (value, objectPath = []) => {
      const isStringified = isStringifiedObject(value);

      // if it's a stringified object, parse and add values;
      if (isStringified) {
        const newParsedObject = JSON.parse(value);
        const keys = Object.keys(newParsedObject);

        keys.forEach((key) => {
          parser(newParsedObject[key], [...objectPath, key]);
        });
      } else {
        // 直接调用即可,addValuesToObject已经修改了newObject本身,不需要额外赋值
        addValuesToObject({ value, keysArray: objectPath, object: newObject });
      }
    };

    parser(stringifiedObject);

    return newObject;
  };

验证结果

用示例输入测试,修改后输出为:

{
  "value1": "name",
  "value2": "lastName",
  "value3": {
    "subValue1": "",
    "subValue2": null
  }
}

符合预期,无多余数字键值对。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 14:57:02