JSON.stringify() 转义值的行结束字符

JSON.stringify() escapes line ending character for values

例如我有以下代码:

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

这导致:

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

如您所见,它在注释值中转义了 '\n' 个字符。换句话说,它将结果字符串中的“\n”替换为“\\n”。 有没有可能我可以避免这种行为? 我尝试在 stringify() 第二个参数中使用替换函数,它做了类似的事情 return v.replace(/\n/g, "\n"); 但它更新了工作(可能是因为原始字符串只包含 \n 并且最终字符串在替换函数完成后被搞砸了)。

还有另一个解决方案在最终字符串上涉及 .replace(/\n/g, "\n"),但它搞砸了 stringify() 函数添加的所有空格:

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

但我希望在 JSON.stringify() 调用后输出格式正确的人类可读字符串,我不需要稍后将其转换回 JSON:

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

您可以改进您的替换逻辑,并捕获原始缩进。然后在替换个人 \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);