Wie kann ich JSON mit node.js hübsch drucken?


435

Dies scheint ein gelöstes Problem zu sein, aber ich kann keine Lösung dafür finden.

Grundsätzlich lese ich eine JSON-Datei, ändere einen Schlüssel und schreibe den neuen JSON in dieselbe Datei zurück. Alles funktioniert, aber ich verliere die JSON-Formatierung. Also anstelle von:

{
  name:'test',
  version:'1.0'
}

Ich bekomme

{name:'test',version:'1.1'}

Gibt es in Node.js eine Möglichkeit, gut formatiertes JSON in eine Datei zu schreiben?


JSON.stringifyDrosseln an zyklischen Objekten und util.inspecterzeugen keinen gültigen JSON. : \ Ich fand keine [native] Lösung zum hübschen Drucken von JSON in NodeJS
ThorSummoner

@ThorSummoner: Dies ist ein Problem mit JSON, nicht mit Node. JSON unterstützt nativ keine zyklischen Referenzen. Hier gibt es eine Lösung in einer anderen Frage .
Sasha Chedygov

Antworten:


813

JSON.stringifyDer dritte Parameter definiert das Einfügen von Leerzeichen für das hübsche Drucken. Dies kann eine Zeichenfolge oder eine Zahl (Anzahl der Leerzeichen) sein. Der Knoten kann mit in Ihr Dateisystem schreiben fs. Beispiel:

var fs = require('fs');

fs.writeFile('test.json', JSON.stringify({ a:1, b:2, c:3 }, null, 4));
/* test.json:
{
     "a": 1,
     "b": 2,
     "c": 3,
}
*/

Siehe die JSON.stringify () -Dokumente unter MDN , Node fs docs


1
Hinweis: Verwenden "\t"Sie anstelle von 4, wenn Sie Registerkarten möchten.
Jeremy Thille

In den neuesten Knoten müssen Sie eine Rückruffunktion als dritten Parameter bereitstellen. Siehe folgende Antwort: stackoverflow.com/a/11677276/675065
Alp

216

Ich denke, das könnte nützlich sein ... Ich liebe Beispielcode :)

var fs = require('fs');

var myData = {
  name:'test',
  version:'1.0'
}

var outputFilename = '/tmp/my.json';

fs.writeFile(outputFilename, JSON.stringify(myData, null, 4), function(err) {
    if(err) {
      console.log(err);
    } else {
      console.log("JSON saved to " + outputFilename);
    }
}); 

3
Stellen Sie sicher, dass der tmpOrdner vorhanden ist. Andernfalls kann dies fehlschlagen.
Larry Battle

2
In den meisten Unix-Systemen (einschließlich Mac & Linux ... und wenn ich mich an BSD erinnere) ist der tmpOrdner standardmäßig vorhanden
Antony

Was ist der Ort (Ausgabedateiname), der bei Windows angegeben werden soll
Devrath

Ich weiß nicht, warum meine Datei ohne den Rückruf nicht geschrieben (nur leer geöffnet) wurde ... Oder vielleicht ist sie asynchron und hat nicht funktioniert, weil beim Start der App eine Ausnahme ausgelöst wurde?
Tomasz Gandor

1
Danke, es hat mir sehr geholfen.
Suraj Jain

83

Wenn Sie ein Objekt nur hübsch drucken und nicht als gültiges JSON exportieren möchten, können Sie es verwenden console.dir().

Es verwendet Syntaxhervorhebung, intelligentes Einrücken, entfernt Anführungszeichen von Tasten und macht die Ausgabe so hübsch wie es nur geht.

const jsonString = `{"name":"John","color":"green",
                     "smoker":false,"id":7,"city":"Berlin"}`
const object = JSON.parse(jsonString)

console.dir(object, {depth: null, colors: true})

Screenshot des protokollierten Objekts

Unter der Haube ist es eine Abkürzung für console.log(util.inspect(…)). Der einzige Unterschied besteht darin, dass alle inspect()für ein Objekt definierten benutzerdefinierten Funktionen umgangen werden.


8
console.dir erzeugt keinen gültigen json.
Gregg Lind

1
@ GreggLind Klargestellt, dass in der Antwort!
Adius

Dadurch kam mein Express-Server zum Stillstand. Ich weiß nicht warum :(
Sanket Berde

34

Wenn Sie dies nicht irgendwo speichern möchten, sondern das Objekt nur zu Debugging-Zwecken anzeigen möchten.

console.log(JSON.stringify(object, null, "  "));

Sie können den dritten Parameter ändern, um die Einrückung anzupassen.


1
Ich habe schon immer nach dieser Lösung gesucht! Der letzte Parameter wirkt wie ein Zauber!
vt2424253

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.