keys - Comment puis-je imprimer de belles couleurs JSON dans un script shell?




jq keys (20)

Pygmentize

Je combine json.tool de Python avec pygmentize:

echo '{"foo": "bar"}' | python -m json.tool | pygmentize -g

Il existe certaines alternatives à segmenter qui sont énumérées dans ma réponse .

Voici une démo en direct:

Existe-t-il un script shell (Unix) pour formater JSON sous une forme lisible par l'homme?

En gros, je veux que cela transforme ce qui suit:

{ "foo": "lorem", "bar": "ipsum" }

... dans quelque chose comme ça:

{
    "foo": "lorem",
    "bar": "ipsum"
}

Vanilla Bash

Un simple script Bash ( grep / awk ) pour une jolie impression JSON, sans installation tierce:

json_pretty.sh

#/bin/bash

grep -Eo '"[^"]*" *(: *([0-9]*|"[^"]*")[^{}\["]*|,)?|[^"\]\[\}\{]*|\{|\},?|\[|\],?|[0-9 ]*,?' | awk '{if ($0 ~ /^[}\]]/ ) offset-=4; printf "%*c%s\n", offset, " ", $0; if ($0 ~ /^[{\[]/) offset+=4}'

Exemples:

1) Lire le fichier et imprimer en console

cat file.json | json_pretty.sh

2) Utilisez avec les fenêtres GIT Bash de fichier à fichier (basé sur UTF8):

cat fileIn.json |sh.exe json_pretty.sh > fileOut.json

Avec Perl, si vous installez JSON::PP partir de CPAN, vous obtiendrez la commande json_pp . En volant l' example de B Bycroft, vous obtenez:

[[email protected] ~]$ echo '{"foo": "lorem", "bar": "ipsum"}' | json_pp
{
   "bar" : "ipsum",
   "foo" : "lorem"
}

Il est à noter que json_pp est livré pré-installé avec Ubuntu 12.04 (au moins) et Debian dans /usr/bin/json_pp


Avec Perl, utilisez le module CPAN JSON::XS . Il installe un outil de ligne de commande json_xs .

Valider:

json_xs -t null < myfile.json

Confirmez le fichier JSON src.json en pretty.json :

< src.json json_xs > pretty.json

Si vous n'avez pas json_xs , essayez json_pp . "pp" est pour "pur perl" - l'outil est implémenté uniquement dans Perl, sans liaison à une bibliothèque C externe (ce que XS signifie, "Système d'extension" de Perl).


C'est comme ça que je le fais:

gem install jazor
jazor --help

Cela raccourcit le code et fait le travail.


Ce n'est pas trop simple avec une méthode native avec les outils jq .

Par exemple:

cat xxx | jq .

D'habitude je fais juste:

echo '{"test":1,"test2":2}' | python -mjson.tool

Et pour récupérer des données sélectionnées (dans ce cas, la valeur de "test"):

echo '{"test":1,"test2":2}' | python -c 'import sys,json;data=json.loads(sys.stdin.read()); print data["test"]'

Si les données JSON sont dans un fichier:

python -mjson.tool filename.json

Si vous voulez tout faire en une fois avec curl sur la ligne de commande, utilisez un jeton d'authentification:

curl -X GET -H "Authorization: Token wef4fwef54te4t5teerdfgghrtgdg53" http://testsite/api/ | python -mjson.tool

Essayez pjson . Il a des couleurs!

Installez-le avec pip :

⚡ pip install pjson

Et puis dirigez n'importe quel contenu JSON vers pjson .


Installez yajl-tools avec la commande ci-dessous:

sudo apt-get install yajl-tools

puis,

echo '{"foo": "lorem", "bar": "ipsum"}' | json_reformat


J'ai écrit un outil qui possède l'un des meilleurs formateurs "d'espaces intelligents" disponibles. Il produit une sortie plus lisible et moins détaillée que la plupart des autres options présentées ici.

underscore-cli

Voici à quoi ressemble "l'espace vide":

Je suis peut-être un peu partial, mais c’est un outil formidable pour imprimer et manipuler des données JSON à partir de la ligne de commande. Il est extrêmement convivial et comprend une aide / documentation complète en ligne de commande. C'est un couteau suisse que j'utilise pour 1001 petites tâches différentes, ce qui serait étonnamment agaçant de le faire autrement.

Dernier cas d'utilisation: Chrome, console de développement, onglet Réseau, exportation sous forme de fichier HAR, "cat site.har | underscore, sélectionnez '.url' --outfmt text | grep mydomain"; J'ai maintenant une liste chronologique de tous les extractions d'URL effectuées lors du chargement du site de mon entreprise.

Une jolie impression est facile:

underscore -i data.json print

Même chose:

cat data.json | underscore print

Même chose, plus explicite:

cat data.json | underscore print --outfmt pretty

Cet outil est mon projet de passion actuel, donc si vous avez des demandes de fonctionnalités, il y a de fortes chances que je les réponde.


J'utilise httpie

$ pip install httpie

Et vous pouvez l'utiliser comme ça

 $ http PUT localhost:8001/api/v1/ports/my 
 HTTP/1.1 200 OK
 Connection: keep-alive
 Content-Length: 93
 Content-Type: application/json
 Date: Fri, 06 Mar 2015 02:46:41 GMT
 Server: nginx/1.4.6 (Ubuntu)
 X-Powered-By: HHVM/3.5.1

 {
     "data": [], 
     "message": "Failed to manage ports in 'my'. Request body is empty", 
     "success": false
 }

J'utilise l'argument "space" de JSON.stringify pour JSON.stringify de jolies impressions JSON en JavaScript.

Exemples:

// Indent with 4 spaces
JSON.stringify({"foo":"lorem","bar":"ipsum"}, null, 4);

// Indent with tabs
JSON.stringify({"foo":"lorem","bar":"ipsum"}, null, '\t');

A partir de la ligne de commande Unix avec nodejs, en spécifiant JSON sur la ligne de commande:

$ node -e "console.log(JSON.stringify(JSON.parse(process.argv[1]), null, '\t'));" \
  '{"foo":"lorem","bar":"ipsum"}'

Résultats:

{
    "foo": "lorem",
    "bar": "ipsum"
}

A partir de la ligne de commande Unix avec Node.js, spécifiez un nom de fichier contenant JSON et utilisez un retrait de quatre espaces:

$ node -e "console.log(JSON.stringify(JSON.parse(require('fs') \
      .readFileSync(process.argv[1])), null, 4));"  filename.json

À l'aide d'un tuyau:

echo '{"foo": "lorem", "bar": "ipsum"}' | node -e \
"\
 s=process.openStdin();\
 d=[];\
 s.on('data',function(c){\
   d.push(c);\
 });\
 s.on('end',function(){\
   console.log(JSON.stringify(JSON.parse(d.join('')),null,2));\
 });\
"

La version de PHP, si vous avez PHP> = 5.4.

alias prettify_json=php -E '$o = json_decode($argn); print json_encode($o, JSON_PRETTY_PRINT);'
echo '{"a":1,"b":2}' | prettify_json

Le JSON Ruby Gem est fourni avec un script shell pour personnaliser le JSON:

sudo gem install json
echo '{ "foo": "bar" }' | prettify_json.rb

Téléchargement du script: gist.github.com/3738968


Ou, avec Ruby:

echo '{ "foo": "lorem", "bar": "ipsum" }' | ruby -r json -e 'jj JSON.parse gets'

Si vous utilisez npm et Node.js, vous pouvez npm install -g json , puis diriger la commande via json . Ne json -h pour obtenir toutes les options. Il peut également extraire des champs spécifiques et coloriser la sortie avec -i .

curl -s http://search.twitter.com/search.json?q=node.js | json

Vous pouvez utiliser: jq

C'est très simple à utiliser et ça marche très bien! Il peut gérer de très grandes structures JSON, y compris des flux. Vous pouvez trouver leurs tutoriels here .

Voici un exemple:

$ jq . <<< '{ "foo": "lorem", "bar": "ipsum" }'
{
  "bar": "ipsum",
  "foo": "lorem"
}

Ou en d'autres termes:

$ echo '{ "foo": "lorem", "bar": "ipsum" }' | jq .
{
  "bar": "ipsum",
  "foo": "lorem"
}

JSONLint a une implémentation open-source sur github qui peut être utilisée en ligne de commande ou incluse dans un projet node.js.

npm install jsonlint -g

et alors

jsonlint -p myfile.json

ou

curl -s "http://api.twitter.com/1/users/show/user.json" | jsonlint | less

jj est ultra-rapide, peut gérer des documents JSON géniaux de manière économique, ne gêne pas les numéros JSON valides et est facile à utiliser, par exemple

jj -p # for reading from STDIN

ou

jj -p -i input.json

Il est (2018) encore assez récent, il ne gérera peut-être pas le JSON invalide comme prévu, mais il est facile à installer sur les principales plates-formes.


UPDATE J'utilise jq maintenant comme suggéré dans une autre réponse. Il est extrêmement puissant pour filtrer le JSON, mais, à la base, il est également un moyen génial d’imprimer de jolis JSON pour la visualisation.

jsonpp est une très belle imprimante JSON en ligne de commande.

Du README:

Les réponses des services Web jolies comme ceci:

curl -s -L http://<!---->t.co/tYTq5Pu | jsonpp

et rendez beaux les fichiers qui circulent sur votre disque:

jsonpp data/long_malformed.json

Si vous utilisez Mac OS X, vous pouvez brew install jsonpp . Sinon, vous pouvez simplement copier le binaire dans quelque part dans votre $PATH .





pretty-print