Запишіть відформатований 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}ви вирішили проблему? Здається, ви правильно опублікували дані.
Райнос,

Дані правильні, але "потворні", я хочу надіслати так, простіше зрозуміти: postbin.org/1ijyltn#xa6rim
Donald

Відповіді:


10

Ну, в першу чергу тому, що JSON не цікавить, як він відформатований, і ви не виконуєте ніякого форматування самі. Вам потрібен javascript prettyprinter, якщо вам все одно, але перше запитання - "Чому ви дбаєте?"

Ось досить друкований код із рецептів Javascript.

Насправді тут на SO є ціла купа різних прикладів .

ОНОВЛЕННЯ

Гаразд, отже, тепер він робить те, що ти хочеш, давайте запитаємо, чи робиш ти правильно. Як зазначали кілька людей, вам не потрібно передавати зайві рядки та вкладки або пробіли; вартість ефективності невелика, ймовірно, близько 2-5 відсотків, але ви ніколи не знаєте, коли вам може знадобитися пара відсотків.

З іншого боку, я повністю погоджуюсь, що набагато зручніше мати можливість читати вихідні дані JSON як досить надрукований текст. Але є й інше рішення - ви все-таки, напевно, використовуєте браузер для перегляду цих результатів, тож замість того, щоб досить друкувати його для передачі, використовуйте досить друкарський пристрій на стороні клієнта. Я використовую JSONView для Chrome та JSONView у Firefox. Багато налагоджувачів також досить друкують результати JSON і для вас.


Для передачі ви не хочете надсилати / отримувати додаткові дані форматування. JSON з додатковими пробілами не означає нічого іншого для машини ... це важливо лише для людини, яка повинна це зрозуміти. В ідеалі, ви хочете гарненько надрукувати його лише тоді, коли у вас насправді є людина, яка повинна на це подивитися.
entropo

@donald чому ти дбаєш про те, як це виглядає? JSON - це необроблені дані. Вас не хвилює пробіл.
Райнос,

ІТ працював як: 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. Можливо, вони просто не захотіли документувати речі, які не були специфічними для вузлів.
Matthew Flaschen

FWIW, здається, це задокументовано практично скрізь, і, схоже, на даний момент не є специфічним для Node.
Дейв Ньютон

6

Я використав двоступеневий процес, який, як мені здалося, працював:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.