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


80

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

这是我用于tesT的代码:

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}您解决了问题吗?看来您正确地发布了数据。
雷诺斯2011年

数据正确但“丑陋”,我想像这样发送,更易于理解:postbin.org/1ijyltn#xa6rim
donald

Answers:


10

好吧,主要是因为JSON不在乎其格式,而且您自己也不进行任何格式化。如果需要的话,您需要的是javascript prettyprinter,但是第一个问题是“为什么要关心”?

这是Javascript食谱中的prettyprinting代码。

实际上,有不同的例子一大堆这里的SO。

更新

好的,现在它正在执行您想要的操作,让我们问一下您是否在做正确的事情。正如一些人指出的那样,您无需传输这些多余的换行符,制表符或空格;效率成本很小,大概在2%到5%之间,但是您永远不知道何时需要几个百分点。

另一方面,我完全同意,能够将JSON输出读取为prettyprinted文本要方便得多。但是还有另一种解决方案-您可能仍在使用浏览器查看这些结果,因此,使用客户端prettyprinter代替为打印而进行漂亮打印。我在Firefox中使用JSONView for ChromeJSONView。许多调试器也会为您漂亮地打印JSON结果。


出于传输目的,您不想发送/接收额外的格式化数据。带有额外空格的JSON与机器没有什么不同……仅对需要了解它的人重要。理想情况下,仅当您实际有需要查看的人时,才希望漂亮地打印它。
entropo 2011年

@donald你为什么在乎它的外观?JSON是原始数据。您不在乎空格。
雷诺斯2011年

IT工作如下:console.log(JSON.stringify({a:1,b:2,c:3},null,'\ t')); 在控制台中,但PostBin仍然无法正确处理。也许是他们的问题?
唐纳德


347

使用JSON.stringify(object, null, 4)where4是用作缩进单位的空格数。"\t"如果需要标签,也可以使用。这实际上是ECMAScript 5规范的一部分,并记录在MDN上


3
哇谢谢!我想知道为什么现在不再记录了。我以为它不可用。
mrjf 2012年

是的,很奇怪。也许是要弃用之类的东西?只是文档监督?不确定。
彼得·里昂斯

6
@PeterLyons,这在ECMAScript 5规范中。也许他们只是不想记录不是特定于节点的事情。
马修·弗拉申

FWIW,到目前为止,似乎几乎所有地方都记录了该文档,并且似乎还不是特定于Node的。
戴夫牛顿

6

我使用了发现可行的两步过程:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.