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?

Rajat
quelle
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

Ricardo Tomasi
quelle
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);
    }
}); 
nym
quelle
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.

Adius
quelle
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.

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

was ist damit?

console.table(object)

Stichprobe

Panuwat Kulcharatyothin
quelle