Existe-t-il un script shell (Unix) pour formater JSON sous une forme lisible par l'homme?
Fondamentalement, je veux qu'il transforme les éléments suivants:
{ "foo": "lorem", "bar": "ipsum" }
... en quelque chose comme ça:
{
"foo": "lorem",
"bar": "ipsum"
}
json
bibliothèque de python , mais j'ai également ajouté des pygments pour obtenir la coloration syntaxique.Réponses:
Avec Python 2.6+, vous pouvez simplement faire:
ou, si le JSON est dans un fichier, vous pouvez faire:
si le JSON provient d'une source Internet telle qu'une API, vous pouvez utiliser
Pour plus de commodité dans tous ces cas, vous pouvez créer un alias:
Pour encore plus de commodité avec un peu plus de frappe pour le préparer:
pour tous les cas ci-dessus. Vous pouvez le mettre
.bashrc
et il sera disponible à chaque fois dans le shell. Invoquez-le commeprettyjson_s '{"foo": "lorem", "bar": "ipsum"}'
.la source
pygmentize -l javascript
pour obtenir une sortie colorée de syntaxe dans votre ligne de commande. Edit : Si vous avez installé des pygments, c'est.alias pretty='python -mjson.tool | pygmentize -l json
afin que je puisse simplement exécuter:command params | pretty
. J'espère que cela t'aides. PS: Si quelqu'un parvient à étendre cela à a) supprimer la sortie curl que je vois à chaque fois et / ou b) NE PAS trier les clés json; faites-le moi savoir, je vous en serai très reconnaissant.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 ici .
Exemples d'utilisation:
Le . est le filtre d'identité.
la source
--sort-keys
option, qui est utile dans certains cas.curl 'https://api.github.com/repos/stedolan/jq/commits?per_page=5' | jq '.'
echo '{ "foo": "lorem", "bar": "ipsum" }' | jq . > myfile
.<<<
opérateur - exactement ce que je cherchais.J'utilise l'argument "espace" de
JSON.stringify
pour imprimer assez JSON en JavaScript.Exemples:
Depuis la ligne de commande Unix avec Node.js, en spécifiant JSON sur la ligne de commande:
Retour:
Depuis la ligne de commande Unix avec Node.js, en spécifiant un nom de fichier qui contient JSON et en utilisant un retrait de quatre espaces:
Utilisation d'un tuyau:
la source
node -p "JSON.stringify(JSON.parse(process.argv[1]), null, '\t');"
sort également le résultat vers STDOUT.J'ai écrit un outil qui possède l'un des meilleurs formateurs "d'espaces blancs intelligents" disponibles. Il produit une sortie plus lisible et moins détaillée que la plupart des autres options ici.
underscore-cli
Voici à quoi ressemble un "espace blanc intelligent":
Je suis peut-être un peu biaisé, mais c'est un outil génial pour imprimer et manipuler des données JSON à partir de la ligne de commande. Il est très convivial à utiliser et dispose d'une aide / documentation en ligne de commande étendue. C'est un couteau suisse que j'utilise pour 1001 petites tâches différentes qui seraient étonnamment ennuyeuses à faire autrement.
Dernier cas d'utilisation: Chrome, console de développement, onglet Réseau, tout exporter sous forme de fichier HAR, "cat site.har | underscore select '.url' --outfmt text | grep mydomain"; J'ai maintenant une liste chronologiquement ordonnée de toutes les récupérations d'URL effectuées pendant le chargement du site de mon entreprise.
La jolie impression est facile:
Même chose:
Même chose, plus explicite:
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 adresse.
la source
[32m
,[33m
,[39m
ainsi que certains non-imprimables avant chacun d'eux, ce qui rend JSON pas valide. Cependant, l' impression de soulignement à elle seule n'ajoute rien à un fichier et fait parfaitement son travail de formatage.jq
mais cela a très bien fonctionné pour mon "JSON" qui n'avait pas de clés entre guillemets doubles.Je fais habituellement juste:
Et pour récupérer des données sélectionnées (dans ce cas, la valeur de "test"):
Si les données JSON sont dans un fichier:
Si vous voulez tout faire en une seule fois avec
curl
sur la ligne de commande en utilisant un jeton d'authentification:la source
| prettyjson
Grâce aux pointeurs très utiles de JF Sebastian, voici un script légèrement amélioré que j'ai trouvé:
la source
dict
objets normaux n'ont pas d'ordre défini. Essayezjson.dumps(json.loads('{"b": 1, "a": 2}'), sort_keys=False)
et vous verrez qu'ils sont échangés de toute façon. Pour le réparer, importezOrderedDict
etload
passezobject_pairs_hook=OrderedDict
.inputFile = sys.stdin
. Cela vous permet de diriger des trucs vers le script comme ceci:curl http://somewhere.com/foo.json | pp_json.py
from collections import OrderedDict
.com! FormatJSON %!python -c "from collections import OrderedDict; import sys; import json; j = json.load(sys.stdin, object_pairs_hook=OrderedDict); json.dump(j, sys.stdout, sort_keys=False, indent=4, separators=(',', ': '))"
Notez que les séparateurs doivent être définis comme (',', ':') pour éviter l'ajout d'espaces de fin: bugs.python.org/issue16333sort_keys = True
place, car je veux l'utiliser pour comparer les fichiers json et cela fonctionne comme un charme.Si vous utilisez npm et Node.js, vous pouvez le faire
npm install -g json
, puis diriger la commandejson
. Faitesjson -h
pour obtenir toutes les options. Il peut également extraire des champs spécifiques et coloriser la sortie avec-i
.la source
Ce n'est pas trop simple avec une manière native avec les outils jq .
Par exemple:
la source
jq . file.json
:; mais aussicat file.json | jq
(sans le filtre.
) fonctionne également. (sur ubuntu / linux; ymmv sur toutes les plateformes)Avec Perl, utilisez le module CPAN
JSON::XS
. Il installe un outil en ligne de commandejson_xs
.Valider:
Prettifiez le fichier JSON
src.json
pourpretty.json
:Si ce n'est pas le cas
json_xs
, essayezjson_pp
. "pp" est pour "pure perl" - l'outil est implémenté en Perl uniquement, sans liaison à une bibliothèque C externe (ce que XS signifie, "Extension System" de Perl).la source
-t null
m'a donné nul: pas un toformat valide ... mais le laisser fonctionner a merveilleusement bien. Merci.Sur * nix, la lecture depuis stdin et l'écriture vers stdout fonctionnent mieux:
Mettez ceci dans un fichier (j'ai nommé le mien "prettyJSON" d'après la réponse d' AnC ) dans votre PATH et
chmod +x
ça, et vous êtes prêt à partir.la source
fileinput.input()
lit depuis stdin s'il n'y a aucun fichier donné sur une ligne de commande. ExempleLe JSON Ruby Gem est fourni avec un script shell pour embellir JSON:
Téléchargement du script: gist.github.com/3738968
la source
json.tool
. Cependant, il semble également avoir des limites de profondeur d'imbrication (nesting of 20 is too deep (JSON::NestingError)
).sudo apt-get install ruby-json-pure
au lieu degem install
prettify_json.rb
?~/bin
dossier (assurez - vous qu'il est dans votre PATH) renommageprettify_json.rb
àppj
et exécuterchmod +x ppj
. Maintenant, vous pouvez faire quelque chose commecurl www.jsonsring.com/something.json | ppj
MISE À JOUR J'utilise
jq
maintenant comme suggéré dans une autre réponse. Il est extrêmement puissant pour filtrer le JSON, mais, dans sa forme la plus basique, c'est aussi un excellent moyen d'imprimer JSON pour le visualiser.jsonpp est une très jolie imprimante JSON en ligne de commande.
Du README:
Si vous êtes sous Mac OS X, vous le pouvez
brew install jsonpp
. Sinon, vous pouvez simplement copier le binaire quelque part dans votre fichier$PATH
.la source
python -mjson.tool
(à partir d'une autre réponse ici) et il a fallu 10 à 20 secondes ...json_pp
- qui formate json bien, bien que malgré la similitude de dénomination, je pense que c'est un projet entièrement différent de celuijsonpp
mentionné iciVoilà comment je le fais:
Il raccourcit le code et fait le travail.
la source
un simple script bash pour une jolie impression json
json_pretty.sh
Exemple:
la source
%*c
notation, j'ai donc changé leprintf
enc=0; while (c++<offset) printf " "; printf $0;
. Et mon awk a différents regex qui s'échappent et la barre oblique inverse ne fonctionne pas[]
. J'ai changé les expressions rationnelles en/^[[{]/
et/[]}]/
.grep
qui a été effacé par erreur;)Essayez
pjson
. Il a des couleurs!Installez-le avec
pip
:⚡ pip install pjson
Et dirigez ensuite tout contenu JSON vers
pjson
.la source
REMARQUE: ce n'est pas la façon de procéder.
La même chose en Perl:
Remarque 2: si vous exécutez
le mot bien lisible devient \ u encodé
Si le reste de votre pipeline gèrera correctement unicode et que vous souhaitez que votre JSON soit également convivial, utilisez simplement
ensure_ascii=False
et vous obtiendrez:
la source
to_json
ne semble pas accepter les options. Mais cela fonctionne:perl -MJSON -nE 'say JSON->new->pretty->encode(from_json $_)' text.json
python -m json.tool
.json.tool
des exemples de code. 1. cette version vous permet de modifier certains paramètres, par exemple,indent
2. Au moment de la publication (2008) Python 2.4 était toujours utilisé et ne prend pas en charge-mjson.tool
J'utilise jshon pour faire exactement ce que vous décrivez. Exécutez simplement:
Vous pouvez également transmettre des arguments pour transformer les données JSON.
la source
Ou, avec Ruby:
la source
to_json
méthodes personnalisées ;Kernel#jj
seuls les tableaux jolis et les hachages identiques (ou les nombres / chaînes / booléens).echo { "foo": "lorem", "bar": "ipsum" } | ruby -r json -e 'jj JSON.parse gets'
Découvrez Jazor . Il s'agit d'un simple analyseur JSON en ligne de commande écrit en Ruby.
la source
curl
et c'est la seule qui l'a fait pour moi.Vous pouvez utiliser cette commande simple pour obtenir le résultat:
la source
JSONLint a une implémentation open-source sur GitHub qui peut être utilisée sur la ligne de commande ou incluse dans un projet Node.js.
et alors
ou
la source
Dirigez simplement la sortie vers
jq .
.Exemple:
la source
cat <file_name.txt> | jq . > <output_name.txt>
brew install jq
si vous êtes sous mac os.jq .
pour la jolie impression présente un inconvénient potentiel : toutes les versions existantes de jq insistent pour traiter les nombres JSON comme des nombres IEEE, donc la précision est facilement perdue, par exemple pour les très grands entiers.cat file |
est invariablement une perte de processus; juste fairejq . <file_name.txt >output_name.txt
(avec littéral<
et>
caractères).Avec Perl, si vous installez JSON :: PP à partir de CPAN, vous obtiendrez la commande json_pp . En volant l' exemple de B Bycroft, vous obtenez:
Il convient de mentionner qu'il
json_pp
est préinstallé avec Ubuntu 12.04 (au moins) et Debian dans/usr/bin/json_pp
la source
Pygmentize
Je combine json.tool de Python avec pygmentize:
Il existe quelques alternatives à pygmentize qui sont répertoriées dans ma cette réponse .
Voici une démo en direct:
la source
pygmentize -l json
pour obtenir la coloration.python-pygments
, soitapt-get install python-pygments
Je recommande d'utiliser l'utilitaire de ligne de commande json_xs qui est inclus dans le module perl JSON :: XS. JSON :: XS est un module Perl pour sérialiser / désérialiser JSON, sur une machine Debian ou Ubuntu vous pouvez l'installer comme ceci:
Il est évidemment également disponible sur CPAN .
Pour l'utiliser pour formater le JSON obtenu à partir d'une URL, vous pouvez utiliser curl ou wget comme ceci:
ou ca:
et pour formater le JSON contenu dans un fichier, vous pouvez le faire:
Pour reformater en YAML , que certaines personnes considèrent comme plus lisible humainement que JSON:
la source
Vous pouvez simplement utiliser des outils standard comme jq ou json_pp.
echo '{ "foo": "lorem", "bar": "ipsum" }' | json_pp
ou
echo '{ "foo": "lorem", "bar": "ipsum" }' | jq
va à la fois embellir la sortie comme suit (jq encore plus coloré):
L'énorme avantage de jq est qu'il peut faire beaucoup plus si vous souhaitez analyser et traiter le json.
la source
jj est super rapide, peut gérer des documents JSON gigantesques de manière économique, ne dérange pas avec les numéros JSON valides et est facile à utiliser, par exemple
ou
C'est (2018) encore assez nouveau, donc il ne traitera peut-être pas le JSON invalide comme vous l'attendez, mais il est facile à installer sur les principales plates-formes.
la source
brew install jq
command + | jq
curl localhost:5000/blocks | jq
)la source
bat
est uncat
clone avec une coloration syntaxique:Exemple:
-p
affichera sans en-têtes et-l
spécifiera explicitement la langue.Il a la coloration et le formatage pour JSON et n'a pas les problèmes notés dans ce commentaire: Comment puis-je joli-imprimer JSON dans un script shell?
la source
Installez yajl-tools avec la commande ci-dessous:
sudo apt-get install yajl-tools
puis,
echo '{"foo": "lorem", "bar": "ipsum"}' | json_reformat
la source