Tengo un código heredado que devuelve json anidado como tal:
"{ "value1": "name", "value2": "lastName", "value3": "{ \"subValue1\": \"\", \"subValue2\": null }" }"
y estoy tratando de escribir una función de analizador que entraría en esos objetos anidados y los analizaría también, sin embargo, obtengo un efecto secundario extraño en el que el analizador hace su trabajo, pero también agrega valores adicionales. Usando el ejemplo anterior, básicamente hace esto:
{ 0: "N", 1: "O", value1: "name", value2: "NO", value3: { subValue1: "", subValue2: null, } }y parece que no puedo depurarlo :/
Aquí está el analizador en cuestión:
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; };si alguien puede ayudarme a evitar la adición completa de "0": "Y", sería muy apreciado.
Editar: estoy de acuerdo con que isStringifiedObject sea un poco inestable, no espero obtener cadenas utilizables que comiencen / terminen con {}
Puede usar JSON.parse con un "revividor" que intenta analizar recursivamente cada cadena decodificada como json (y devuelve el argumento tal como está si eso falla):
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))