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?


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


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

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.


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.


1
Je cherche cette solution comme jamais! Le dernier param fonctionne comme un charme!
vt2424253

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.