typescript - JSON.stringify() escapează caracterul de sfârșit de linie pentru valori


De exemplu, am următorul cod:

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));

Ceea ce duce la:

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

După cum poți vedea, escapează caracterele '\n' din valoarea comentariilor. Cu alte cuvinte, înlocuiește '\n' cu '\\n' în șirul rezultat. Există vreo posibilitate prin care aș putea evita acest comportament? Am încercat să folosesc funcția replace în al doilea parametru al stringify() care face ceva de genul return v.replace(/\\n/g, "\n");, dar nu a funcționat niciodată (probabil pentru că șirul original conține doar \n și șirul final se strica după ce funcția replace se termina).

Există, de asemenea, o altă soluție care implică .replace(/\\n/g, "\n") pe șirul final, dar aceasta strică toate spațiile goale pe care funcția stringify() le adaugă:

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

Dar vreau un șir bine formatat, ușor de citit de oameni, în rezultat după apelul JSON.stringify() și nu am nevoie să îl convertesc înapoi în JSON mai târziu:

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

Răspuns #1

Ai putea să îmbunătățești logica de înlocuire și să capturezi indentarea originală. Apoi reinseră acea indentare atunci când înlocuiești fiecare \n:

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);