Escribir un objeto JSON en un archivo JSON con fs.writeFileSync

116

Estoy intentando escribir un objeto JSON en un archivo JSON. El código se ejecuta sin errores, pero en lugar de escribir el contenido del objeto, todo lo que se escribe en el archivo JSON es:

[object Object]

Este es el código que realmente escribe:

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

'salida' es un objeto JSON y el archivo ya existe. Por favor, avíseme si necesita más información.

Romulus3799
fuente
11
fs.writeFileSync ('../ data / fraseFreqs.json', JSON.stringify (salida))
Daniel
Posible duplicado de Escribir objetos en un archivo con Node.js
Neeraj Sewani

Respuestas:

169

Necesita secuenciar el objeto.

fs.writeFileSync('../data/phraseFreqs.json', JSON.stringify(output));
Kamal
fuente
2
Bienvenido a SO, antes de responder una pregunta, intente revisar la respuesta existente. Si tu respuesta ya ha sido sugerida, vota a favor de esa respuesta. Consulte la guía de la comunidad para escribir una buena respuesta.
LightBender
44
Me gusta que esto responda a la pregunta sin opiniones sobre si usar o no operaciones síncronas o asíncronas.
Brian Duncan
1
Para facilitar la lectura, puede utilizar el parámetro de espacio del método JSON.stringify: fs.writeFileSync('../data/phraseFreqs.json', JSON.stringify(output, null, 2));Más: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Binh
48

No creo que debas usar el enfoque síncrono, escribir datos de forma asincrónica en un archivo es mejor también especificar outputsi es un archivo object.

Nota: Si outputes una cadena, especifique la codificación y recuerde también las flagopciones:

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

Se agregó un método sincrónico para escribir datos en un archivo, pero considere su caso de uso. Ejecución asíncrona vs síncrona, ¿qué significa realmente?

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

fs.writeFileSync('/tmp/phraseFreqs.json', content);
akinjide
fuente
9
Si se hace en un script corto o algo así, sincrónico está bien. Si es parte de una solicitud del servidor o algo así, entonces debería ser asincrónico.
Hilton Shumway
1
No necesariamente, los procesos enlazados de E / S deben hacerse asincrónicos, pero dependiendo de la complejidad del script corto, puede optar por los síncronos.
akinjide
4
Esta no es una respuesta a la pregunta.
Stephan Bijzitter
6
El usuario solicitó específicamente el método sincrónico
Anthony
7
Deje de decir async bueno. E implicando mala sincronización. Si le preocupa la velocidad, su paquete web debería hacer esa optimización por usted. No eres un optimizador. Razón: la escritura de archivos de sincronización es necesaria para las herramientas de línea de comandos de json. Que debe cerrar cualquier archivo que tenga abierto antes de canalizar los datos a la siguiente aplicación de la cadena.
TamusJRoyce
27

Haga que json sea legible por humanos pasando un tercer argumento a stringify:

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

Al enviar datos a un servidor web, los datos deben ser una cadena ( aquí ). Puede convertir un objeto JavaScript en una cadena con JSON.stringify(). Aquí hay un ejemplo de trabajo:

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

Espero que pueda ayudar.

Reza Baradaran Gazorisangi
fuente
1

Aquí hay una variación, usando la versión de fsque usa promesas:

const fs = require('fs');

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