Come posso stampare graziosamente JSON usando node.js?


436

Sembra un problema risolto ma non riesco a trovare una soluzione.

Fondamentalmente, ho letto un file JSON, cambio una chiave e riscrivo il nuovo JSON nello stesso file. Funziona tutto, ma perdo la formattazione JSON. Quindi, invece di:

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

ottengo

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

Esiste un modo in Node.js per scrivere file JSON ben formattati?


JSON.stringifysoffoca su oggetti ciclici e util.inspectnon produce json valido. : \ Non ho trovato alcuna soluzione [nativa] per stampare in modo carino JSON in NodeJS
ThorSummoner

@ThorSummoner: questo è un problema con JSON, non con Node: JSON non supporta in modo nativo riferimenti ciclici. C'è una soluzione qui, in un'altra domanda .
Sasha Chedygov,

Risposte:


816

JSON.stringifyIl terzo parametro definisce l'inserimento di spazi vuoti per la stampa carina. Può essere una stringa o un numero (numero di spazi). Node può scrivere sul tuo filesystem con fs. Esempio:

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,
}
*/

Vedi i documenti JSON.stringify () su MDN , Node fs docs


1
Nota: anziché 4, utilizzare "\t"se si desidera schede.
Jeremy Thille,

Negli ultimi nodejs è necessario fornire una funzione di callback come terzo parametro, vedere questa risposta: stackoverflow.com/a/11677276/675065
Alp

216

Penso che questo possa essere utile ... Adoro il codice di esempio :)

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

4
Assicurati che la tmpcartella esista altrimenti potrebbe non riuscire.
Larry Battle,

2
nella maggior parte dei sistemi unix (inclusi Mac e Linux..e se ricordo BSD), la tmpcartella esiste di default
Antony,

qual è la posizione (nome file di output) da fornire in caso di Windows
Devrath,

Non so perché il mio file non sia stato scritto (appena aperto vuoto) senza il callback ... O forse è asincrono e non ha funzionato perché ho avuto un'eccezione durante l'avvio dell'app?
Tomasz Gandor,

1
Grazie, mi ha aiutato molto.
Suraj Jain,

83

Se vuoi semplicemente stampare un oggetto e non esportarlo come JSON valido, puoi usarlo console.dir().

Utilizza l'evidenziazione della sintassi, il rientro intelligente, rimuove le virgolette dalle chiavi e rende l'output più bello che mai.

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

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

Schermata dell'oggetto registrato

Sotto il cofano è una scorciatoia per console.log(util.inspect(…)). L'unica differenza è che ignora qualsiasi inspect()funzione personalizzata definita su un oggetto.


8
console.dir non produce json valido.
Gregg Lind,

1
@GreggLind Chiarito nella risposta!
adius,

Questo ha reso il mio server express in stallo. Non so perché :(
Sanket Berde,

34

Se non si desidera archiviarlo da nessuna parte, ma visualizzare l'oggetto per scopi di debug.

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

È possibile modificare il terzo parametro per regolare il rientro.


1
Ho cercato questa soluzione per sempre! L'ultimo param funziona come un incantesimo!
vt2424253

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.