Napisz sformatowany JSON w Node.js.

81

Używam Node.js do POST JSON na PostBin, ale dane są nieprawidłowo sformatowane (jak widać tutaj: http://www.postbin.org/1cpndqw ).

Oto kod, którego używam do 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();
donald
źródło
{"a":1,"b":2,"c":3}czy naprawiłeś swój problem? Wygląda na to, że dane zostały przesłane poprawnie.
Raynos
Dane są poprawne, ale "brzydkie", chcę wysłać w ten sposób, łatwiejsze do zrozumienia: postbin.org/1ijyltn#xa6rim
donald

Odpowiedzi:

10

Cóż, głównie dlatego, że JSON nie dba o to, jak jest sformatowany, a Ty sam nie formatujesz. Potrzebujesz ładnej drukarki javascript, jeśli cię to obchodzi, ale pierwsze pytanie brzmi: „Dlaczego cię to obchodzi?”

Oto kod prettyprinting z przepisów Javascript.

Faktycznie istnieje cała masa różnych przykładów tutaj na SO.

AKTUALIZACJA

Okay, więc teraz robi to, co chcesz, zapytajmy, czy postępujesz właściwie. Jak zauważyło kilka osób, nie musisz przesyłać tych dodatkowych znaków nowej linii i tabulatorów ani spacji; koszt wydajności jest niewielki, prawdopodobnie w okolicach 2-5 procent, ale nigdy nie wiadomo, kiedy będziecie potrzebować kilku procent.

Z drugiej strony zgadzam się całkowicie, że znacznie wygodniej jest odczytać dane wyjściowe JSON jako ładnie wydrukowany tekst. Ale jest inne rozwiązanie - prawdopodobnie nadal używasz przeglądarki do przeglądania tych wyników, więc zamiast ładnie drukować go do transmisji, użyj prettyprinter po stronie klienta. Używam JSONView dla Chrome i JSONView w Firefoksie. Wiele debuggerów również ładnie wydrukuje wyniki JSON.

Charlie Martin
źródło
W celach transmisyjnych nie chcesz wysyłać / odbierać dodatkowych danych formatujących. JSON z dodatkowymi białymi znakami nie różni się niczym od maszyny ... ma znaczenie tylko dla człowieka, który musi go zrozumieć. Idealnie byłoby, gdybyś chciał go ładnie wydrukować tylko wtedy, gdy faktycznie masz osobę, która musi na to spojrzeć.
entropo
@donald, dlaczego przejmujesz się tym, jak to wygląda? JSON to surowe dane. Nie przejmujesz się białymi znakami.
Raynos
Działał jako: console.log (JSON.stringify ({a: 1, b: 2, c: 3}, null, '\ t')); w konsoli, ale mimo to PostBin nie robi tego dobrze. Może to ich problem?
donald
348

Użyj JSON.stringify(object, null, 4)gdzie 4jest liczbą spacji, które mają być używane jako jednostka wcięcia. Możesz także użyć, "\t"jeśli chcesz, karty. W rzeczywistości jest to część specyfikacji ECMAScript 5 i jest udokumentowana w MDN .

Peter Lyons
źródło
3
Wow, dzięki! Zastanawiam się, dlaczego nie jest to już udokumentowane. Zakładałem, że nie jest dostępny.
mrjf
Tak, to dziwne. Może to jest na drodze do wycofania lub coś? Tylko przeoczenie dokumentacji? Niepewny.
Peter Lyons,
6
@PeterLyons, to jest w specyfikacji ECMAScript 5. Może po prostu nie mieli ochoty dokumentować rzeczy, które nie były specyficzne dla węzła.
Matthew Flaschen
FWIW, wydaje się, że jest to udokumentowane praktycznie wszędzie i na razie nie wydaje się być specyficzne dla węzła.
Dave Newton
6

Użyłem dwuetapowego procesu, który okazał się skuteczny:

var output = JSON.parse(insert_json_here);
var print_to_file = JSON.stringify(output, null, "\t")
Fritz Dodoo
źródło
2

Powinieneś sprawdzić underscore-cli - jest to narzędzie wiersza poleceń do inspekcji i przetwarzania danych JSON.

Dave Dopson
źródło