ChatGPT解决这个技术问题 Extra ChatGPT

如何使用 node.js 漂亮地打印 JSON?

这似乎是一个已解决的问题,但我无法找到解决方案。

基本上,我读取一个 JSON 文件,更改一个密钥,然后将新的 JSON 写回同一个文件。一切正常,但我失去了 JSON 格式。所以,而不是:

{
  name:'test',
  version:'1.0'
}

我明白了

{name:'test',version:'1.1'}

Node.js 中有没有办法将格式良好的 JSON 写入文件?

JSON.stringify 阻塞循环对象,util.inspect 不会产生有效的 json。 :\ 我没有找到在 NodeJS 中漂亮打印 JSON 的 [native] 解决方案
@ThorSummoner:这是 JSON 的问题,而不是 Node 的问题——JSON 本身不支持循环引用。有一个解决方案 here, in another question

w
worc

JSON.stringify 的第三个参数定义了用于漂亮打印的空白插入。它可以是字符串或数字(空格数)。节点可以使用 fs 写入您的文件系统。例子:

var fs = require('fs');

fs.writeFile('test.json', JSON.stringify({ a:1, b:2, c:3 }, null, 4));
/* test.json:
{
     "a": 1,
     "b": 2,
     "c": 3,
}
*/

请参阅 JSON.stringify() docs at MDNNode fs docs


注意:如果需要标签,请使用 "\t" 而不是 4。
在最新的 nodejs 中,您需要提供回调函数作为第三个参数,请参阅此答案:stackoverflow.com/a/11677276/675065
@Alp 表示 fs.writeFile 的第三个参数;如果 write 是脚本中的最后一个命令,则实际上不必使用回调。如果你想在 writeFile 之后做一些事情,你只需要回调,而不是退出进程。
3
3 revs, 3 users 94%

我认为这可能有用......我喜欢示例代码:)

var fs = require('fs');

var myData = {
  name:'test',
  version:'1.0'
}

var outputFilename = '/tmp/my.json';

fs.writeFile(outputFilename, JSON.stringify(myData, null, 4), function(err) {
    if(err) {
      console.log(err);
    } else {
      console.log("JSON saved to " + outputFilename);
    }
}); 

确保 tmp 文件夹存在,否则可能会失败。
在大多数 unix 系统(包括 Mac 和 Linux..如果我记得 BSD)中,默认情况下存在 tmp 文件夹
在 Windows 的情况下要给出的位置(输出文件名)是什么
谢谢,对我帮助很大。
@TomaszGandor:默认情况下,Node 中的所有 I/O 都是异步的,因此 writeFile 调用不会阻塞程序。如果你不传递回调,Node 就没有更多代码要运行,所以它会在调用后立即退出,很可能在实际写入完成之前退出。
a
adius

如果您只想漂亮地打印一个对象而不是将其导出为有效的 JSON,您可以使用 console.dir()

它使用语法高亮,智能缩进,从键中删除引号,并使输出尽可能漂亮。

const jsonString = `{"name":"John","color":"green",
                     "smoker":false,"id":7,"city":"Berlin"}`
const object = JSON.parse(jsonString)

console.dir(object, {depth: null, colors: true})

https://i.stack.imgur.com/ALZfc.png

它实际上是 console.log(util.inspect(…)) 的快捷方式。唯一的区别是它绕过了在对象上定义的任何自定义 inspect() 函数。


console.dir 不会产生有效的 json。
@GreggLind 在答案中澄清了这一点!
这使我的快递服务器停滞不前。我不知道为什么:(
S
Sanket Berde

如果您不想将其存储在任何地方,而只是查看对象以进行调试。

console.log(JSON.stringify(object, null, "  "));

您可以更改第三个参数来调整缩进。


我一直在寻找这个解决方案——就像永远一样!最后一个参数就像一个魅力!
S
Samuel Philipp

那这个呢?

console.table(object)

https://i.stack.imgur.com/8PJK6.png


对于小型数据集,这是一个很好的解决方案,但对于大型、复杂、深度嵌套的对象,基本上不可能通过所有换行来读取。我想也可能有解决方案。
i
illvart

我知道这是个老问题。但也许这可以帮助你😀

JSON字符串

var jsonStr = '{ "bool": true, "number": 123, "string": "foo bar" }';

漂亮的打印 JSON

JSON.stringify(JSON.parse(jsonStr), null, 2);

缩小 JSON

JSON.stringify(JSON.parse(jsonStr));

j
jkonst

另一种解决方法是使用 prettier 来格式化 JSON。下面的示例使用“json”解析器,但也可以使用“json5”,请参阅 list of valid parsers

const prettier = require("prettier");
console.log(prettier.format(JSON.stringify(object),{ semi: false, parser: "json" }));

G
GMC

如果 prettify 是新行上的名称值对,那么在 stringify 中指定空格数对我不起作用唯一对我有用的是

await fs.promises.writeFile('testdataattr.json',JSON.stringify(datatofile, null,'\r\n'),'utf8') ;