Búsqueda de sitios web

typescript - JSON.stringify() escapa el carácter de fin de línea para los valores


Por ejemplo, tengo el siguiente código:

var obj = {
    name: "alex",
    lastname: "aaa",
    portfolio: {
        stocks: "TSLA, BA"
    },
    comments: "some\nrandom\ndescription"
};

console.log("JSON OUT:\n" + obj.comments);

console.log("STRING OUT:\n" + JSON.stringify(obj, null, 2));

Lo que resulta en:

JSON OUT:
some
random
description
STRING OUT:
{
  "name": "alex",
  "lastname": "aaa",
  "portfolio": {
    "stocks": "TSLA, BA"
  },
  "comments": "some\nrandom\ndescription"
}

Como puedes ver, escapa los caracteres \n en el valor de los comentarios. En otras palabras, reemplaza \n con \\n en la cadena resultante. ¿Hay alguna posibilidad de cómo podría evitar este comportamiento? Intenté usar la función replace en el segundo parámetro de stringify() que hace algo como esto return v.replace(/\\n/g, "\n"); pero nunca funcionó (probablemente porque la cadena original contiene solo \n y la cadena final se arruina después de que la función replace termina).

También existe otra solución que implica .replace(/\\n/g, "\n") en la cadena final, pero arruina todos los espacios en blanco que la función stringify() añade:

{
  "name": "alex",
  "lastname": "aaa",
  "portfolio": {
    "stocks": "TSLA, BA"
  },
  "comments": "some
random
description"
}

Pero quiero una cadena bien formateada y legible para humanos en la salida después de la llamada a JSON.stringify() y no necesito convertirla de nuevo a JSON más tarde:

{
  "name": "alex",
  "lastname": "aaa",
  "portfolio": {
    "stocks": "TSLA, BA"
  },
  "comments": "some
  random
  description"
}

Respuesta #1

Podrías mejorar tu lógica de reemplazo y capturar la sangría original. Luego reinserta esa sangría al reemplazar el \n individual:

var obj = {
    name: "alex",
    lastname: "aaa",
    portfolio: {
        stocks: "TSLA, BA"
    },
    comments: "some\nrandom\ndescription"
};

let result = JSON.stringify(obj, null, 2).replace(/^(\s*).*\\n.*$/gm, (line, indent) =>
    line.replace(/\\n/g, "\n" + indent)
);
console.log(result);