Schreiben eines JSON-Objekts in eine JSON-Datei mit fs.writeFileSync

116

Ich versuche, ein JSON-Objekt in eine JSON-Datei zu schreiben. Der Code wird fehlerfrei ausgeführt, aber anstatt dass der Inhalt des Objekts geschrieben wurde, wird nur Folgendes in die JSON-Datei geschrieben:

[object Object]

Dies ist der Code, der tatsächlich das Schreiben übernimmt:

fs.writeFileSync('../data/phraseFreqs.json', output)

'output' ist ein JSON-Objekt und die Datei ist bereits vorhanden. Bitte lassen Sie mich wissen, wenn weitere Informationen erforderlich sind.

Romulus3799
quelle
11
fs.writeFileSync ('../ data / PhraseFreqs.json', JSON.stringify (Ausgabe))
Daniel
Mögliches Duplikat von Objekte in Datei mit Node.js schreiben
Neeraj Sewani

Antworten:

169

Sie müssen das Objekt stringifizieren.

fs.writeFileSync('../data/phraseFreqs.json', JSON.stringify(output));
Kamal
quelle
2
Willkommen bei SO, bevor Sie eine Frage beantworten, versuchen Sie, die vorhandene Antwort zu überprüfen. Wenn Ihre Antwort bereits vorgeschlagen wurde, stimmen Sie stattdessen dieser Antwort zu. Eine gute Antwort finden Sie im Community-Handbuch .
LightBender
44
Ich finde es gut, dass dies die Frage ohne Meinungen darüber beantwortet, ob synchrone oder asynchrone Operationen verwendet werden sollen oder nicht.
Brian Duncan
1
Aus Gründen der Lesbarkeit können Sie den Leerzeichenparameter der JSON.stringify-Methode verwenden: fs.writeFileSync('../data/phraseFreqs.json', JSON.stringify(output, null, 2));Weitere Informationen : developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Binh
48

Ich glaube nicht , dass Sie den synchronen Ansatz verwenden sollte, asynchron Daten in eine Datei zu schreiben besser ist auch die stringify outputwenn es eine ist object.

Hinweis: Wenn outputes sich um eine Zeichenfolge handelt, geben Sie die Codierung an und merken Sie sich auch die flagOptionen:

const fs = require('fs');
const content = JSON.stringify(output);

fs.writeFile('/tmp/phraseFreqs.json', content, 'utf8', function (err) {
    if (err) {
        return console.log(err);
    }

    console.log("The file was saved!");
}); 

Synchrone Methode zum Schreiben von Daten in eine Datei hinzugefügt, aber bitte berücksichtigen Sie Ihren Anwendungsfall. Asynchrone oder synchrone Ausführung, was bedeutet das wirklich?

const fs = require('fs');
const content = JSON.stringify(output);

fs.writeFileSync('/tmp/phraseFreqs.json', content);
akinjide
quelle
9
Wenn es in einem kurzen Skript oder so gemacht wird, ist synchron synchron in Ordnung. Wenn es Teil einer Serveranforderung ist oder so, sollte es asynchron sein.
Hilton Shumway
1
Nicht unbedingt sollten E / A-gebundene Prozesse asynchron gemacht werden, aber abhängig von der Komplexität des kurzen Skripts können Sie sich für die Synchronisierung entscheiden.
Akinjide
4
Dies ist keine Antwort auf die Frage.
Stephan Bijzitter
6
Benutzer speziell nach synchroner Methode gefragt
Anthony
7
Bitte hör auf, asynchron gut zu sagen. Und was bedeutet, dass die Synchronisierung schlecht ist. Wenn Sie sich Sorgen um die Geschwindigkeit machen, sollte Ihr Webpack diese Optimierung für Sie durchführen. Sie sind kein Optimierer. Grund: Für json-Befehlszeilentools ist das Schreiben von Synchronisierungsdateien erforderlich. Diese müssen alle geöffneten Dateien schließen, bevor Daten an die nächste App in der Kette weitergeleitet werden.
TamusJRoyce
27

Machen Sie den json-Menschen lesbar, indem Sie ein drittes Argument an stringifyfolgende Adresse übergeben :

fs.writeFileSync('../data/phraseFreqs.json', JSON.stringify(output, null, 4));
Timelot
quelle
1

Beim Senden von Daten an einen Webserver müssen die Daten eine Zeichenfolge sein ( hier ). Sie können ein JavaScript-Objekt mit in eine Zeichenfolge konvertieren JSON.stringify(). Hier ist ein Arbeitsbeispiel:

var fs = require('fs');

var originalNote = {
  title: 'Meeting',
  description: 'Meeting John Doe at 10:30 am'
};

var originalNoteString = JSON.stringify(originalNote);

fs.writeFileSync('notes.json', originalNoteString);

var noteString = fs.readFileSync('notes.json');

var note = JSON.parse(noteString);

console.log(`TITLE: ${note.title} DESCRIPTION: ${note.description}`);

Hoffe es könnte helfen.

Reza Baradaran Gazorisangi
quelle
1

Hier ist eine Variation, bei der die Version fsverwendet, die Versprechen verwendet:

const fs = require('fs');

await fs.promises.writeFile('../data/phraseFreqs.json', JSON.stringify(output)); // UTF-8 is default
Flimm
quelle