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.


11
fs.writeFileSync ('../ data / fraseFreqs.json', JSON.stringify (saída))
— Daniel

Respostas:


169

Você precisa restringir o objeto.

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

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

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

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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.