解析嵌套的字符串化 json 对象

慢性逻辑

我有一些遗留代码返回嵌套的字符串化 json,如下所示:

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

并且我正在尝试编写一个解析器函数,该函数将进入这些嵌套对象,并解析它们,但是,我得到了一个奇怪的副作用,解析器完成其工作,但也添加了额外的值。使用上面的例子,它基本上是这样做的:

{
  0: "N",
  1: "O",
  value1: "name",
  value2: "NO",
  value3: {
    subValue1: "",
    subValue2: null,
  }
}

我似乎无法调试它:/

这是有问题的解析器:

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 {
        const newEntry = addValuesToObject({ value, keysArray: objectPath, object: newObject });
        newObject = { ...newObject, ...newEntry };
      }
    };

    parser(stringifiedObject);

    return newObject;
  };

如果有人能帮助我避免整个添加“0”:“Y”的事情,我将不胜感激。

编辑:我觉得isStringifiedObject有点奇怪,我不希望得到以开头/结尾的可用字符串{}

乔治

您可以使用JSON.parse“reviver”,它递归地尝试将每个解码的字符串解析为 json(并在失败时按原样返回参数):

function parseNested(str) {
    try {
        return JSON.parse(str, (_, val) => {
            if (typeof val === 'string')
                return parseNested(val)
            return val
        })
    } catch (exc) {
        return str
    }
}

// demo

obj = {
    'abc': 'def',
    'foo': 'bar',
    'nest1': JSON.stringify({deep1: 123}),
    'nest2': JSON.stringify({deep2: JSON.stringify({deep3: ['something', 'else']})}),
}

weird = JSON.stringify(obj)
console.log(weird)
console.log(parseNested(weird))

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用Postgres解析字符串化的JSON对象

如何使用python获取(解析)Json嵌套字符串(来自API)数据,如对象

使用节点中嵌套对象的字符串文字进行 JSON 解析

如何在Moshi中将对象的字段编码为字符串化的JSON而不是嵌套的JSON对象?

解析字典的最快pythonic方法,其中值是字节字符串化json对象

无法解析具有mongo db对象ID以及“ \”的json序列化字符串

将JSON查询字符串解析为JSON对象

如何解析json字符串并迭代json对象

解析包含Json字符串的JSON对象

无法将字符串Json解析为Json对象

FOR JSON PATH 返回嵌套对象的转义字符串

通过字符串引用嵌套的json对象属性

如何访问JSON字符串中的嵌套对象

java:从字符串创建嵌套的json对象

用Newtonsoft Json.Net反序列化字符串化的(带引号的)嵌套对象

解析文件路径字符串到json对象

Javascript:解析字符串中的json对象数组

如何解析此JSON对象/字符串?

不使用 JSON 解析字符串对象

将 JSON 从字符串解析为对象

Javascript-解析JSON寻找对象字符串

Nodejs - 将字符串解析为 JSON 对象

将JSON对象解析为Java中的字符串

将字符串转换或解析为JSON对象

如何解析字符串或对象的 JSON 数组?

JSON解析,字符串到对象,(“无法将JSON对象转换为JSON数组”)

JSON字符串化跳过具有三个以上级别的跳过嵌套对象

JSON使用已经作为值的JSON字符串对对象进行字符串化

在字符串化的JSON对象值中添加引号

TOP 榜单

热门标签

归档