【问题标题】:How can I pretty-print JSON using node.js?如何使用 node.js 漂亮地打印 JSON?
【发布时间】:2011-08-05 23:00:43
【问题描述】:

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

基本上,我读取一个 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

标签: json node.js


【解决方案1】:

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

JSON 字符串

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

漂亮的打印 JSON

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

缩小 JSON

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      这个呢?

      console.table(object)
      

      【讨论】:

      • 这对于小型数据集来说是一个很好的解决方案,但对于大型、复杂、深度嵌套的对象,使用所有换行基本上是不可能读取的。我想也可能有解决方案。
      【解决方案4】:

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

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

      你可以改变第三个参数来调整缩进。

      【讨论】:

      • 我一直在寻找这个解决方案——就像永远一样!最后一个参数就像一个魅力!
      【解决方案5】:

      如果您只想漂亮地打印一个对象而不是将其导出为有效的 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})
      

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

      【讨论】:

      • console.dir 没有生成有效的 json。
      • @GreggLind 在答案中澄清了这一点!
      • 这让我的快递服务器停了下来。我不知道为什么:(
      【解决方案6】:

      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之后做一些事情,你只需要回调,而不是退出进程。
      【解决方案7】:

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

      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 就没有更多代码要运行,所以它会在调用后立即退出,可能在实际写入完成之前。
      猜你喜欢
      • 2013-10-03
      • 2015-07-03
      • 2015-08-26
      相关资源
      最近更新 更多