Записать отформатированный JSON в Node.js

81

Я использую Node.js для POST JSON в 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}ты исправил свою проблему? Похоже, вы правильно разместили данные.
Raynos
Данные верные, но «некрасивые», я хочу послать вот так, чтобы было проще понять: postbin.org/1ijyltn#xa6rim
дональд

Ответы:

10

Ну, в первую очередь потому, что JSON не волнует, как он отформатирован, а вы сами не форматируете. Что вам нужно, это javascript prettyprinter, если вам не все равно, но первый вопрос: «Почему вас это волнует?»

Вот симпатичный печатный код из рецептов Javascript.

На самом деле здесь, на SO , есть масса разных примеров .

ОБНОВИТЬ

Хорошо, теперь он делает то, что вы хотите, давайте спросим, ​​правильно ли вы делаете. Как указали несколько человек, вам не нужно передавать эти дополнительные символы новой строки и табуляции или пробелы; затраты на эффективность невелики, вероятно, около 2–5 процентов, но никогда не знаешь, когда может понадобиться пара процентов.

С другой стороны, я полностью согласен с тем, что гораздо удобнее читать вывод JSON как красиво напечатанный текст. Но есть и другое решение - вы, вероятно, все еще используете браузер для просмотра этих результатов, поэтому вместо того, чтобы распечатывать их для передачи, используйте симпатичный принтер на стороне клиента. Я использую JSONView для Chrome и JSONView в Firefox. Многие отладчики также могут распечатать результаты JSON для вас.

Чарли Мартин
источник
В целях передачи вы не хотите отправлять / получать дополнительные данные форматирования. JSON с дополнительными пробелами ничего не значит для машины ... это важно только для человека, который должен это понимать. В идеале, вы хотите красиво распечатать это только тогда, когда у вас действительно есть человек, которому нужно на это взглянуть.
entropo
@donald, почему тебя волнует, как это выглядит? JSON - это необработанные данные. Вам наплевать на пробелы.
Raynos
ОНО работало как: console.log (JSON.stringify ({a: 1, b: 2, c: 3}, null, '\ t')); в консоли, но все равно PostBin не исправляет. Может это их проблема?
Дональд
348

Используйте JSON.stringify(object, null, 4)где 4- количество пробелов, используемых в качестве единицы отступа. Вы также можете использовать, "\t"если хотите, вкладки. Фактически это часть спецификации ECMAScript 5 и задокументирована на MDN .

Питер Лайонс
источник
3
Вау, спасибо! Интересно, почему это больше не задокументировано. Я предположил, что он недоступен.
mrjf
Ага, это странно. Может, он на пути к устареванию или что-то в этом роде? Просто надзор за документацией? Не уверена.
Питер Лайонс
6
@PeterLyons, это в спецификации ECMAScript 5. Возможно, им просто не хотелось документировать вещи, не относящиеся к конкретным узлам.
Мэтью Флашен
FWIW, похоже, что это документировано практически повсюду и на данный момент не похоже на конкретный узел.
Dave Newton
6

Я использовал двухэтапный процесс, который, как мне показалось, работал:

var output = JSON.parse(insert_json_here);
var print_to_file = JSON.stringify(output, null, "\t")
Фриц Доду
источник
2

Вам следует проверить underscore-cli - это инструмент командной строки для проверки и обработки данных JSON.

Дэйв Допсон
источник