Comment est-ce que je peux joli-imprimer JSON utilisant node.js?

436

Cela semble être un problème résolu mais je ne parviens pas à trouver de solution.

Fondamentalement, je lis un fichier JSON, change une clé et réécris le nouveau JSON dans le même fichier. Tout fonctionne, mais je perds la mise en forme JSON. Au lieu de:

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

Je reçois

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

Existe-t-il un moyen dans Node.js d'écrire du JSON bien formaté dans un fichier?

Rajat
la source
JSON.stringifys'étouffe avec les objets cycliques et util.inspectne produit pas de json valide. : \ Je n'ai trouvé aucune solution [native] pour une jolie impression JSON dans NodeJS
ThorSummoner
@ThorSummoner: C'est un problème avec JSON, pas avec Node - JSON ne prend pas en charge nativement les références cycliques. Il y a une solution ici, dans une autre question .
Sasha Chedygov

Réponses:

816

JSON.stringifyLe troisième paramètre définit l'insertion d'espaces blancs pour la jolie impression. Il peut s'agir d'une chaîne ou d'un nombre (nombre d'espaces). Le nœud peut écrire sur votre système de fichiers avec fs. Exemple:

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

Voir les documents JSON.stringify () sur MDN , Node fs docs

Ricardo Tomasi
la source
1
Remarque: au lieu de 4, utilisez "\t"si vous voulez des onglets.
Jeremy Thille
Dans les derniers nodejs, vous devez fournir une fonction de rappel comme troisième paramètre, voir cette réponse: stackoverflow.com/a/11677276/675065
Alp
216

Je pense que cela pourrait être utile ... J'adore l'exemple de code :)

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);
    }
}); 
nym
la source
4
Assurez-vous que le tmpdossier existe, sinon cela pourrait échouer.
Larry Battle
2
dans la plupart des systèmes Unix (y compris Mac et Linux ... et si je me souviens de BSD), le tmpdossier existe par défaut
Antony
quel est l'emplacement (nom du fichier de sortie) à donner en cas de fenêtres
Devrath
Je ne sais pas pourquoi mon fichier n'a pas été écrit (juste ouvert vide) sans le rappel ... Ou peut-être que c'est asynchrone, et cela n'a pas fonctionné car j'ai eu une exception levée lors du démarrage de l'application?
Tomasz Gandor,
1
Merci, ça m'a beaucoup aidé.
Suraj Jain
83

Si vous souhaitez simplement imprimer un objet et ne pas l'exporter en tant que JSON valide, vous pouvez utiliser console.dir() .

Il utilise la coloration syntaxique, l'indentation intelligente, supprime les guillemets des clés et rend la sortie aussi jolie que possible.

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

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

Capture d'écran de l'objet enregistré

Sous le capot, c'est un raccourci pour console.log(util.inspect(…)) . La seule différence est qu'il contourne toute inspect()fonction personnalisée définie sur un objet.

adius
la source
8
console.dir ne produit pas de json valide.
Gregg Lind
1
@GreggLind Clarifié cela dans la réponse!
adius
Cela a bloqué mon serveur express. Je ne sais pas pourquoi :(
Sanket Berde
34

Si vous ne voulez pas le stocker n'importe où, mais affichez simplement l'objet à des fins de débogage.

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

Vous pouvez modifier le troisième paramètre pour ajuster l'indentation.

Sanket Berde
la source
1
Je cherche cette solution comme jamais! Le dernier param fonctionne comme un charme!
vt2424253
11

Et ça?

console.table(object)

échantillon

Panuwat Kulcharatyothin
la source