Écriture d'un objet JSON dans un fichier JSON avec fs.writeFileSync

116

J'essaye d'écrire un objet JSON dans un fichier JSON. Le code s'exécute sans erreur, mais au lieu que le contenu de l'objet ait été écrit, tout ce qui est écrit dans le fichier JSON est:

[object Object]

C'est le code qui fait réellement l'écriture:

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

'output' est un objet JSON et le fichier existe déjà. S'il vous plaît laissez-moi savoir si plus d'informations sont nécessaires.

Romulus3799
la source
11
fs.writeFileSync ('../ data / phraseFreqs.json', JSON.stringify (sortie))
Daniel
Possible duplication des objets Write dans le fichier avec Node.js
Neeraj Sewani

Réponses:

169

Vous devez stringifier l'objet.

fs.writeFileSync('../data/phraseFreqs.json', JSON.stringify(output));
Kamal
la source
2
Bienvenue à SO, avant de répondre à une question, essayez de revoir la réponse existante. Si votre réponse a déjà été suggérée, votez plutôt pour cette réponse. Consultez le guide communautaire pour rédiger une bonne réponse.
LightBender
44
J'aime que cela réponde à la question sans opinions sur l'opportunité d'utiliser ou non les opérations synchrones ou asynchrones.
Brian Duncan
1
Pour des raisons de lisibilité, vous pouvez utiliser le paramètre space de la méthode JSON.stringify: fs.writeFileSync('../data/phraseFreqs.json', JSON.stringify(output, null, 2));Plus: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Binh
48

Je ne pense pas que vous devriez utiliser l'approche synchrone, l'écriture asynchrone de données dans un fichier est préférable également de stringifier le outputsi c'est unobject .

Remarque: Si outputest une chaîne, spécifiez l'encodage et rappelez-vous également les flagoptions:

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!");
}); 

Ajout de la méthode synchrone d'écriture de données dans un fichier, mais veuillez considérer votre cas d'utilisation. Exécution asynchrone ou synchrone, qu'est-ce que cela signifie vraiment?

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

fs.writeFileSync('/tmp/phraseFreqs.json', content);
akinjide
la source
9
Si cela est fait dans un script court ou quelque chose du genre, synchrone est bien. Si cela fait partie d'une demande de serveur ou quelque chose, alors il devrait être asynchrone.
Hilton Shumway
1
Pas nécessairement, les processus liés aux E / S doivent être rendus asynchrones, mais en fonction de la complexité du script court, vous pouvez opter pour synchrone.
akinjide
4
Ce n'est pas une réponse à la question.
Stephan Bijzitter
6
L'utilisateur a spécifiquement demandé une méthode synchrone
Anthony
7
Veuillez arrêter de dire async good. Et impliquant une mauvaise synchronisation. Si vous êtes préoccupé par la vitesse, votre pack Web devrait faire cette optimisation pour vous. Vous n'êtes pas un optimiseur. Raison: l'écriture du fichier de synchronisation est nécessaire pour les outils de ligne de commande json. Ce qui doit fermer tous les fichiers ouverts avant de rediriger les données vers l'application suivante de la chaîne.
TamusJRoyce
27

Rendez le json lisible par l'homme en passant un troisième argument à stringify:

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

Lors de l'envoi de données à un serveur Web, les données doivent être une chaîne ( ici ). Vous pouvez convertir un objet JavaScript en chaîne avec JSON.stringify(). Voici un exemple de travail:

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}`);

J'espère que cela pourrait aider.

Reza Baradaran Gazorisangi
la source
1

Voici une variante, en utilisant la version de fsqui utilise des promesses:

const fs = require('fs');

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