Como posso imprimir JSON usando o node.js?


436

Parece um problema resolvido, mas não consigo encontrar uma solução para ele.

Basicamente, leio um arquivo JSON, altero uma chave e escrevo de volta o novo JSON no mesmo arquivo. Tudo funciona, mas eu perco a formatação JSON.

{
  name:'test',
  version:'1.0'
}

eu recebo

{name:'test',version:'1.1'}

Existe uma maneira no Node.js gravar JSON bem formatado em um arquivo?


JSON.stringifyengasga com objetos cíclicos e util.inspectnão produz json válido. : \ Eu não encontrei nenhuma solução [nativa] para imprimir JSON bonita no NodeJS
ThorSummoner

@ ThorSummoner: Esse é um problema com o JSON, não com o Nó - o JSON não suporta nativamente referências cíclicas. Há uma solução aqui, em outra pergunta .
Sasha Chedygov

Respostas:


814

JSON.stringifyO terceiro parâmetro define a inserção de espaço em branco para uma impressão bonita. Pode ser uma sequência ou um número (número de espaços). O nó pode gravar no seu sistema de arquivos com fs. Exemplo:

var fs = require('fs');

fs.writeFile('test.json', JSON.stringify({ a:1, b:2, c:3 }, null, 4));
/* test.json:
{
     "a": 1,
     "b": 2,
     "c": 3,
}
*/

Consulte os documentos JSON.stringify () em MDN , Node fs docs


1
Nota: em vez de 4, use "\t"se desejar guias.
Jeremy Thille

Nos nodejs mais recentes, é necessário fornecer uma função de retorno de chamada como terceiro parâmetro, consulte esta resposta: stackoverflow.com/a/11677276/675065
Alp

216

Eu acho que isso pode ser útil ... Adoro código de exemplo :)

var fs = require('fs');

var myData = {
  name:'test',
  version:'1.0'
}

var outputFilename = '/tmp/my.json';

fs.writeFile(outputFilename, JSON.stringify(myData, null, 4), function(err) {
    if(err) {
      console.log(err);
    } else {
      console.log("JSON saved to " + outputFilename);
    }
}); 

3
Verifique se a tmppasta existe ou isso pode falhar.
Larry Battle

2
na maioria dos sistemas unix (incluindo Mac e Linux..e se bem me lembro do BSD), a tmppasta existe por padrão
Antony

Qual é a localização (nome do arquivo de saída) a ser dada em caso de janelas
Devrath

Não sei por que meu arquivo não foi gravado (apenas aberto em branco) sem o retorno de chamada ... Ou talvez seja assíncrono e não funcionou porque tive uma exceção lançada durante a inicialização do aplicativo?
Tomasz Gandor 12/09

1
Obrigado, isso me ajudou muito.
Suraj Jain 02/02

83

Se você deseja apenas imprimir um objeto e não exportá-lo como JSON válido, pode usar console.dir().

Ele usa realce de sintaxe, recuo inteligente, remove aspas das chaves e apenas torna a saída a mais bonita possível.

const jsonString = `{"name":"John","color":"green",
                     "smoker":false,"id":7,"city":"Berlin"}`
const object = JSON.parse(jsonString)

console.dir(object, {depth: null, colors: true})

Captura de tela do objeto registrado

Sob o capô, é um atalho para console.log(util.inspect(…)). A única diferença é que ele ignora qualquer inspect()função personalizada definida em um objeto.


8
console.dir não produz json válido.
Gregg Lind

1
@GreggLind Esclareceu isso na resposta!
Adius

Isso fez meu servidor expresso parar. Não sei por que :(
Sanket Berde 28/09

34

Se você não deseja armazenar isso em nenhum lugar, apenas visualize o objeto para fins de depuração.

console.log(JSON.stringify(object, null, "  "));

Você pode alterar o terceiro parâmetro para ajustar o recuo.


1
Eu tenho procurado por esta solução - como sempre! O último parâmetro funciona como um encanto!
vt2424253 21/03/19

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.