在Node.js中编写格式化的JSON

86

我正在使用Node.js将JSON提交到PostBin,但数据格式错误(如您在此处所见:http://www.postbin.org/1cpndqw)。

以下是我用于测试的代码:

var http = require('http');

var options = {
  host: 'www.postbin.org',
  port: 80,
  path: '/1cpndqw',
  method: 'POST'
};

var req = http.request(options, function(res) {
  console.log('STATUS: ' + res.statusCode);
  console.log('HEADERS: ' + JSON.stringify(res.headers));
  res.setEncoding('utf8');
  res.on('data', function (chunk) {
    console.log('BODY: ' + chunk);
  });
});

req.write(JSON.stringify({ a:1, b:2, c:3 }, null, 4));
req.end();

{"a":1,"b":2,"c":3} 你解决了问题吗?看起来你已经正确地发布了数据。 - Raynos
数据是正确的,但是“丑陋”,我想发送像这样更容易理解的内容:http://www.postbin.org/1ijyltn#xa6rim - donald
4个回答

354

使用JSON.stringify(object, null, 4),其中4是用作缩进单位的空格数。如果您想要使用制表符,则可以使用"\t"。这实际上是ECMAScript 5规范的一部分,并且在MDN文档中有说明。


3
哇,谢谢!我想知道为什么这不再被记录下来了。我以为它不可用了。 - mrjf
是的,这很奇怪。也许它正在走向废弃或其他什么?只是文档上的疏忽吗?不确定。 - Peter Lyons
6
@PeterLyons,这在ECMAScript 5规范中有提到。也许他们只是觉得没有必要记录那些不特定于Node.js的事情。 - Matthew Flaschen
就我所知,这似乎已经被广泛记录,并且目前看来并不是特定于Node的。 - Dave Newton

10
首先,JSON并不关心它的格式,而且您也没有进行任何格式化。如果您在意,您需要一个JavaScript漂亮打印机,但第一个问题是:“为什么您要在意呢?”这里有来自JavaScript Recipes的漂亮打印代码。实际上,这里有很多不同的示例在SO上。
更新
好吧,现在它正在做你想要的事情,让我们问一下你是否在做正确的事情。正如几个人指出的那样,您不必传输那些额外的换行符、制表符或空格;效率成本很小,可能在2-5%,但您永远不知道什么时候您可能需要几个百分点。另一方面,我完全同意,能够将JSON输出作为漂亮的文本阅读更加方便。但还有另一种解决方案——您仍然可能使用浏览器查看这些结果,因此不要对传输进行漂亮打印,而是使用客户端漂亮打印机。我在Chrome中使用JSONView for Chrome和在Firefox中使用JSONView。许多调试器也会为您漂亮地打印JSON结果。

为了传输目的,您不希望发送/接收额外的格式数据。带有额外空格的JSON对机器来说没有任何不同...这只关乎需要理解它的人类。理想情况下,您只需要在确实有需要查看它的人时才进行漂亮打印。 - entropo
@Donald,你为什么关心它的外观?JSON是原始数据。你不需要在意空格。 - Raynos
它在控制台中运行为:console.log(JSON.stringify({ a:1, b:2, c:3 }, null, '\t')); 但是,PostBin仍然无法正确处理。也许这是他们的问题? - donald
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify - BentOnCoding

8

我使用了一个两步法,发现它很有效:

var output = JSON.parse(insert_json_here);
var print_to_file = JSON.stringify(output, null, "\t")

2
你应该看看 underscore-cli - 这是一个用于检查和处理JSON数据的命令行工具。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接