Gravar objeto JSON em um arquivo JSON com fs.writeFileSync

116

Estou tentando escrever um objeto JSON em um arquivo JSON. O código é executado sem erros, mas em vez do conteúdo do objeto que foi escrito, tudo o que é escrito no arquivo JSON é:

[object Object]

Este é o código que realmente faz a escrita:

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

'output' é um objeto JSON e o arquivo já existe. Por favor, me avise se mais informações forem necessárias.

Romulus3799
fonte
11
fs.writeFileSync ('../ data / fraseFreqs.json', JSON.stringify (saída))
Daniel
Possível duplicata de objetos Write em arquivo com Node.js
Neeraj Sewani

Respostas:

169

Você precisa restringir o objeto.

fs.writeFileSync('../data/phraseFreqs.json', JSON.stringify(output));
Kamal
fonte
2
Bem-vindo ao SO, antes de responder a uma pergunta, tente revisar a resposta existente. Se sua resposta já foi sugerida, vote positivamente nessa resposta. Consulte o guia da comunidade para escrever uma boa resposta.
LightBender
44
Eu gosto que isso responda à pergunta sem opiniões sobre se deve ou não usar operações síncronas ou assíncronas.
Brian Duncan
1
Para fins de legibilidade, você pode usar o parâmetro de espaço do método JSON.stringify: fs.writeFileSync('../data/phraseFreqs.json', JSON.stringify(output, null, 2));Mais: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Binh
48

Eu não acho que você deva usar a abordagem síncrona, gravar dados de forma assíncrona em um arquivo é melhor também stringify outputse for um object.

Observação: se outputfor uma string, especifique a codificação e lembre-se das flagopções também:

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

Método síncrono adicionado para gravar dados em um arquivo, mas considere seu caso de uso. Execução assíncrona vs síncrona, o que isso realmente significa?

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

fs.writeFileSync('/tmp/phraseFreqs.json', content);
akinjide
fonte
9
Se estiver sendo feito em um script curto ou algo assim, não há problema em sincronizar. Se for parte de uma solicitação do servidor ou algo assim, deve ser assíncrono.
Hilton Shumway
1
Não necessariamente, os processos vinculados a E / S devem ser assíncronos, mas dependendo da pequena complexidade do script, você pode optar pelo síncrono.
akinjide
4
Esta não é uma resposta à pergunta.
Stephan Bijzitter
6
O usuário solicitou especificamente o método síncrono
Anthony,
7
Por favor, pare de dizer assíncrono bom. E sugerindo sincronização ruim. Se você está preocupado com a velocidade, seu webpack deve fazer essa otimização para você. Você não é um otimizador. Motivo: a gravação do arquivo de sincronização é necessária para as ferramentas de linha de comando json. Que deve fechar todos os arquivos abertos antes de canalizar dados para o próximo aplicativo na cadeia.
TamusJRoyce 01 de
27

Torne o json humano legível passando um terceiro argumento para stringify:

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

Ao enviar dados para um servidor web, os dados devem ser uma string ( aqui ). Você pode converter um objeto JavaScript em uma string com JSON.stringify(). Aqui está um exemplo prático:

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 possa ajudar.

Reza Baradaran Gazorisangi
fonte
1

Aqui está uma variação, usando a versão fsque usa promessas:

const fs = require('fs');

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