Schreiben Sie formatierten JSON in Node.js.

80

Ich verwende Node.js, um JSON an PostBin zu senden, aber die Daten werden falsch formatiert (wie Sie hier sehen können: http://www.postbin.org/1cpndqw ).

Dies ist der Code, den ich für tesT verwende:

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
quelle
{"a":1,"b":2,"c":3}Hast du dein Problem behoben? Anscheinend haben Sie die Daten korrekt veröffentlicht.
Raynos
Die Daten sind korrekt, aber "hässlich", ich möchte so senden, leichter zu verstehen: postbin.org/1ijyltn#xa6rim
Donald

Antworten:

10

Vor allem, weil es JSON egal ist, wie es formatiert ist, und Sie selbst keine Formatierung vornehmen. Was Sie brauchen, ist ein hübscher Javascript-Drucker, wenn Sie sich interessieren, aber die erste Frage lautet: "Warum interessiert es Sie?"

Hier ist ein hübscher Druckcode aus den Javascript-Rezepten.

Tatsächlich gibt es hier auf SO eine ganze Reihe verschiedener Beispiele .

AKTUALISIEREN

Okay, jetzt macht es, was Sie wollen. Fragen wir, ob Sie das Richtige tun. Wie mehrere Personen bereits betont haben, müssen Sie diese zusätzlichen Zeilenumbrüche, Tabulatoren oder Leerzeichen nicht übertragen. Die Effizienzkosten sind gering, wahrscheinlich in der Nähe von 2 bis 5 Prozent, aber Sie wissen nie, wann Sie möglicherweise ein paar Prozent benötigen.

Andererseits stimme ich voll und ganz zu, dass es viel bequemer ist, die JSON-Ausgabe als hübsch gedruckten Text lesen zu können. Aber es gibt noch eine andere Lösung: Sie verwenden wahrscheinlich immer noch einen Browser, um diese Ergebnisse anzuzeigen. Verwenden Sie also einen clientseitigen Pretty-Drucker, anstatt ihn für die Übertragung auszudrucken. Ich verwende JSONView für Chrome und JSONView in Firefox. Viele Debugger drucken die JSON-Ergebnisse auch für Sie aus.

Charlie Martin
quelle
Zu Übertragungszwecken möchten Sie die zusätzlichen Formatierungsdaten nicht senden / empfangen. Der JSON mit zusätzlichen Leerzeichen bedeutet nichts anderes als die Maschine ... es ist nur für einen Menschen wichtig, der es verstehen muss. Idealerweise möchten Sie es nur hübsch drucken, wenn Sie tatsächlich eine Person haben, die es sich ansehen muss.
Entropo
@ Donald, warum interessiert es dich, wie es aussieht? JSON sind Rohdaten. Sie interessieren sich nicht für Leerzeichen.
Raynos
IT funktionierte als: console.log (JSON.stringify ({a: 1, b: 2, c: 3}, null, '\ t')); in der Konsole macht PostBin es aber trotzdem nicht richtig. Vielleicht ist es ihr Problem?
Donald
346

Verwenden Sie JSON.stringify(object, null, 4)wo 4ist die Anzahl der Leerzeichen, die als Einrückungseinheit verwendet werden sollen. Sie können auch verwenden, "\t"wenn Sie Registerkarten möchten. Dies ist tatsächlich Teil der ECMAScript 5-Spezifikation und auf MDN dokumentiert .

Peter Lyons
quelle
2
Wow, danke! Ich frage mich, warum das nicht mehr dokumentiert ist. Ich nahm an, dass es nicht verfügbar war.
Mrjf
Ja, es ist seltsam. Vielleicht ist es auf dem Weg zur Abwertung oder so? Nur ein Dokumentationsaufsicht? Nicht sicher.
Peter Lyons
6
@PeterLyons, dies ist in der ECMAScript 5-Spezifikation enthalten. Vielleicht hatten sie einfach keine Lust, Dinge zu dokumentieren, die nicht knotenspezifisch waren.
Matthew Flaschen
FWIW, dies scheint im Wesentlichen überall dokumentiert zu sein und scheint derzeit nicht knotenspezifisch zu sein.
Dave Newton
6

Ich habe einen zweistufigen Prozess verwendet, der funktioniert hat:

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

Sie sollten underscore-cli ausprobieren - es ist ein Befehlszeilentool zum Überprüfen und Verarbeiten von JSON-Daten.

Dave Dopson
quelle