Scrittura di un oggetto JSON in un file JSON con fs.writeFileSync


116

Sto cercando di scrivere un oggetto JSON in un file JSON. Il codice viene eseguito senza errori, ma invece di scrivere il contenuto dell'oggetto, tutto ciò che viene scritto nel file JSON è:

[object Object]

Questo è il codice che esegue effettivamente la scrittura:

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

"output" è un oggetto JSON e il file esiste già. Per favore fatemi sapere se sono necessarie ulteriori informazioni.


11
fs.writeFileSync ('../ data / phraseFreqs.json', JSON.stringify (output))
Daniel,

Risposte:


169

Devi stringere l'oggetto.

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

2
Benvenuto in SO, prima di rispondere a una domanda, prova a rivedere la risposta esistente. Se la tua risposta è già stata suggerita, votala invece. Vedere la guida della comunità per scrivere una buona risposta.
LightBender

44
Mi piace che questo risponda alla domanda senza opinioni sull'opportunità o meno di utilizzare operazioni sincrone o asincrone.
Brian Duncan

1
Per motivi di leggibilità, puoi utilizzare il parametro spazio del metodo JSON.stringify: fs.writeFileSync('../data/phraseFreqs.json', JSON.stringify(output, null, 2));Altro: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Binh

48

Non penso che dovresti usare l'approccio sincrono, scrivere in modo asincrono i dati su un file è meglio anche stringere outputse è un file object.

Nota: se outputè una stringa, specifica la codifica e ricorda anche le flagopzioni:

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

Aggiunto metodo sincrono per scrivere dati in un file, ma considera il tuo caso d'uso. Esecuzione asincrona o sincrona, cosa significa veramente?

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

fs.writeFileSync('/tmp/phraseFreqs.json', content);

9
Se viene eseguito in un breve script o qualcosa del genere, il sincrono va bene. Se fa parte di una richiesta del server o qualcosa del genere, dovrebbe essere asincrono.
Hilton Shumway

1
Non necessariamente, i processi associati a I / O dovrebbero essere resi asincroni, ma a seconda della complessità dello script breve, potresti optare per sincrono.
akinjide

4
Questa non è una risposta alla domanda.
Stephan Bijzitter

6
L'utente ha richiesto specificamente il metodo sincrono
Anthony

7
Per favore smettila di dire asincrono buono. E implica una cattiva sincronizzazione. Se sei preoccupato per la velocità, il tuo webpack dovrebbe eseguire l'ottimizzazione per te. Non sei un ottimizzatore. Motivo: la scrittura del file di sincronizzazione è necessaria per gli strumenti della riga di comando json. Che deve chiudere tutti i file aperti prima di inviare i dati all'app successiva nella catena.
TamusJRoyce

27

Rendi leggibile il json umano passando un terzo argomento a stringify:

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

1

Quando si inviano dati a un server web, i dati devono essere una stringa ( qui ). Puoi convertire un oggetto JavaScript in una stringa con JSON.stringify(). Ecco un esempio funzionante:

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

Spero possa aiutare.


1

Ecco una variazione, utilizzando la versione fsche utilizza le promesse:

const fs = require('fs');

await fs.promises.writeFile('../data/phraseFreqs.json', JSON.stringify(output)); // UTF-8 is default
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.