Comment puis-je imprimer JSON dans un script shell?

3062

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"
}
AnC
la source
7
J'ai roulé la mienne il y a peu de temps: github.com/exhuma/braindump/tree/master/jsonformat Le code est très simple, en utilisant la jsonbibliothèque de python , mais j'ai également ajouté des pygments pour obtenir la coloration syntaxique.
exhuma
Je suis tombé dessus, mais j'ai trouvé Json Pretty et j'aime bien ça. Typekit l'utilise dans leurs exemples d'API, donc il y a du klout derrière ça ^^
Nick Tomlin
Si cela ne vous dérange pas de copier-coller, il existe également des outils simples en ligne comme jsonprettyprint.net où vous pouvez rapidement imprimer votre JSON brut.
Javaaaa
7
Soyez averti: python -m json.tool ne produit pas toujours un JSON valide. (Indice: 1e1000)
pic

Réponses:

4462

Avec Python 2.6+, vous pouvez simplement faire:

echo '{"foo": "lorem", "bar": "ipsum"}' | python -m json.tool

ou, si le JSON est dans un fichier, vous pouvez faire:

python -m json.tool my_json.json

si le JSON provient d'une source Internet telle qu'une API, vous pouvez utiliser

curl http://my_url/ | python -m json.tool

Pour plus de commodité dans tous ces cas, vous pouvez créer un alias:

alias prettyjson='python -m json.tool'

Pour encore plus de commodité avec un peu plus de frappe pour le préparer:

prettyjson_s() {
    echo "$1" | python -m json.tool
}

prettyjson_f() {
    python -m json.tool "$1"
}

prettyjson_w() {
    curl "$1" | python -m json.tool
}

pour tous les cas ci-dessus. Vous pouvez le mettre .bashrcet il sera disponible à chaque fois dans le shell. Invoquez-le comme prettyjson_s '{"foo": "lorem", "bar": "ipsum"}'.

campovski
la source
73
Vous pouvez diriger cela vers pygmentize -l javascriptpour obtenir une sortie colorée de syntaxe dans votre ligne de commande. Edit : Si vous avez installé des pygments, c'est.
Shrikant Sharat
177
Une grande réponse, je ne garde avec lui est - il fait sorte les clés sur la production - dont vous pourriez avoir besoin d'être au courant.
Chris Nash
14
Dans mon .vimrc "nnoremap <f5>:%! Python -m json.tool <CR>: w <CR>"
imwilsonxu
40
Cela semble échapper les caractères Unicode dans \ uXXXX, ce qui pourrait être un inconvénient.
user1071136
14
J'ai créé un alias: alias pretty='python -mjson.tool | pygmentize -l jsonafin 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.
Clint Eastwood
1023

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:

$ jq --color-output . file1.json file1.json | less -R

$ command_with_json_output | jq .

$ jq . # stdin/"interactive" mode, just enter some JSON

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

Le . est le filtre d'identité.

Vita Pluvia
la source
11
Il existe également une --sort-keysoption, qui est utile dans certains cas.
Matthew Flaschen
9
Travailler avec curl:curl 'https://api.github.com/repos/stedolan/jq/commits?per_page=5' | jq '.'
Hover Ruan
19
"jq." est génial en tant que jolie imprimante, mais il est accompagné d'une mise en garde: jq (jusqu'à la version 1.5 de jq incluse) modifiera les valeurs des très grands et très petits nombres car il analyse les valeurs numériques en tant que valeurs IEEE 754 64 bits. Pour vérifier si votre jolie imprimante préférée a le même problème, essayez cette valeur: 1e1000. Notez que python -mjson.tool échoue mal à ce test en ce qu'il produit Infinity, qui n'est même pas JSON.
pic du
1
Comme une note, vous pouvez rediriger le résultat vers un fichier formaté: echo '{ "foo": "lorem", "bar": "ipsum" }' | jq . > myfile.
Tchad
26
@Meekohi l'alternative est "l'utilisation inutile de l'écho". Super content d'avoir trouvé l' <<<opérateur - exactement ce que je cherchais.
jchook
381

J'utilise l'argument "espace" de JSON.stringifypour imprimer assez 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');

Depuis la ligne de commande Unix avec Node.js, 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"}'

Retour:

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

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:

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

Utilisation 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));\
 });\
"
Krinkle
la source
10
Pour déboguer des objets dans Node.js, vous devez vraiment utiliser sys.inspect () au lieu de JSON.stringify (). Voici pourquoi: markhansen.co.nz/inspecting-with-json-stringify
Gurpartap Singh
11
Voté. L'OP concerne un "script de ligne de commande * nix" et cette réponse est un contexte différent.
danorton
49
@danorton: JS peut être utilisé à partir de la ligne de commande via node.js et d'autres solutions similaires.
calvinf
10
Pas besoin de la console: node -p "JSON.stringify(JSON.parse(process.argv[1]), null, '\t');"sort également le résultat vers STDOUT.
Julian D.
2
Il suce que le script est différent pour un nom de fichier vs stdin
Lukasz Wiktor
340

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:

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 adresse.

Dave Dopson
la source
4
J'ai également mis à jour mon ~ / .bash_profile pour avoir la ligne suivante: alias underscor = 'underscore print --outfmt pretty' maintenant je peux juste faire curl example.com/result.json | soulignement et utilise toujours le soulignement pour d'autres formats
Gal Bracha
Merci Dave! L'outil est bon! alias pretty-json = "underrsore pretty" et sortie curl agréable à l'oeil
Maxim Ponomarev
Excellent outil de formatage, une seule remarque: la transmission de la sortie vers un fichier (avec l' option -o ou avec > ) ne fonctionne qu'avec l' impression de soulignement . underscore assez enregistre un fichier avec la couleur de mise en forme des signes étant insérés, lissée comme: [32m, [33m, [39mainsi 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.
tiurin
J'adore jqmais cela a très bien fonctionné pour mon "JSON" qui n'avait pas de clés entre guillemets doubles.
Bluu
@DaveDopson merci pour le super outil !! Je vais essayer de l'utiliser avec jsonselect.org/#tryit ...
mycargus
173

Je fais habituellement 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 seule fois avec curlsur la ligne de commande en utilisant un jeton d'authentification:

curl -X GET -H "Authorization: Token wef4fwef54te4t5teerdfgghrtgdg53" http://testsite/api/ | python -mjson.tool
locojay
la source
si le json est censé provenir directement d'une API http, c'est aussi un bel outil implémenté en python: github.com/jkbr/httpie
Florian
Si vous avez installé un nœud (et ne vous occupez pas de la sortie de style YAML), il y a aussi ce package: rafeca.com/prettyjson pour que vous puissiez mettre fin à une boucle avec | prettyjson
Iolo
3
Comme indiqué ci-dessus, l'un des problèmes avec python -mjson.tool en tant que jolie imprimante JSON est qu'il n'émet pas toujours JSON. Par exemple, 1e1000 devient Infinity (que vous utilisiez python 2.x ou 3.x). 'jq.' produit toujours du JSON, mais il ne garantit pas que les très grandes (ou très petites valeurs) sont préservées exactement.
pic du
88

Grâce aux pointeurs très utiles de JF Sebastian, voici un script légèrement amélioré que j'ai trouvé:

#!/usr/bin/python

"""
Convert JSON data to human-readable form.

Usage:
  prettyJSON.py inputFile [outputFile]
"""

import sys
import simplejson as json


def main(args):
    try:
        if args[1] == '-':
            inputFile = sys.stdin
        else:
            inputFile = open(args[1])
        input = json.load(inputFile)
        inputFile.close()
    except IndexError:
        usage()
        return False
    if len(args) < 3:
        print json.dumps(input, sort_keys = False, indent = 4)
    else:
        outputFile = open(args[2], "w")
        json.dump(input, outputFile, sort_keys = False, indent = 4)
        outputFile.close()
    return True


def usage():
    print __doc__


if __name__ == "__main__":
    sys.exit(not main(sys.argv))
AnC
la source
3
Lorsque les valeurs sont chargées dans le dictionnaire, l'ordre est perdu: les dictobjets normaux n'ont pas d'ordre défini. Essayez json.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, importez OrderedDictet loadpassez object_pairs_hook=OrderedDict.
icktoofay
Vous pouvez modifier le script à lire depuis l' entrée standard avec ceci: inputFile = sys.stdin. Cela vous permet de diriger des trucs vers le script comme ceci:curl http://somewhere.com/foo.json | pp_json.py
Gabe Johnson
1
Et pour éviter le tri avec @ commentaire de icktoofay, OrderedDict import comme ceci: from collections import OrderedDict.
Hugo
2
Merci @icktoofay. Cela m'a permis de créer la fonction vim suivante: 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/issue16333
blindsnowmobile
Grand extrait! Je l'ai utilisé à la sort_keys = Trueplace, car je veux l'utiliser pour comparer les fichiers json et cela fonctionne comme un charme.
JL Peyret
81

Si vous utilisez npm et Node.js, vous pouvez le faire npm install -g json, puis diriger la commande json. Faites json -hpour 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
gregers
la source
79

Ce n'est pas trop simple avec une manière native avec les outils jq .

Par exemple:

cat xxx | jq .
Peter Mortensen
la source
7
AVERTISSEMENT: jq code les nombres sous forme de flottants 64 bits IEEE 754, et donc leur représentation est susceptible de changer. La précision des très petits et très grands nombres est susceptible d'être perdue. Pour vérifier si votre jolie imprimante préférée a le même problème, essayez cette valeur: 1e1000.
pic
5
ou simplement jq . file.json:; mais aussi cat file.json | jq(sans le filtre .) fonctionne également. (sur ubuntu / linux; ymmv sur toutes les plateformes)
michael
73

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

Valider:

json_xs -t null < myfile.json

Prettifiez le fichier JSON src.jsonpour pretty.json:

< src.json json_xs > pretty.json

Si ce n'est pas le cas json_xs, essayez json_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).

knb
la source
9
Semble venir en standard avec Cygwin!
Janus Troelsen
13
json_pp peut être utilisé de la même manière et est très probablement facilement installé sur votre système (sur Debian, il est dans le paquet 'perl').
MichielB
8
Pour info, sur mon système Mac OS X 10.9, json_pp est disponible automatiquement.
Gregg Williams
-t nullm'a donné nul: pas un toformat valide ... mais le laisser fonctionner a merveilleusement bien. Merci.
Lucas
pp est pour perl pur, pas joli print ici :) Étant donné que json_xs et json_pp peuvent faire plus que simplement joli print et aussi avec -json_opt faire autre chose au lieu de joli print. Bien que la jolie impression soit le comportement par défaut.
Kjetil S.20
70

Sur * nix, la lecture depuis stdin et l'écriture vers stdout fonctionnent mieux:

#!/usr/bin/env python
"""
Convert JSON data to human-readable form.

(Reads from stdin and writes to stdout)
"""

import sys
try:
    import simplejson as json
except:
    import json

print json.dumps(json.loads(sys.stdin.read()), indent=4)
sys.exit(0)

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.

Daryl Spitzer
la source
En effet, utiliser stdin / stdout est beaucoup plus flexible et simple. Merci de l'avoir signalé.
AnC
3
Pour les programmes qui attendent un fichier nommé, utilisez / dev / stdin, idem pour out et err.
dvogel
4
FYI fileinput.input()lit depuis stdin s'il n'y a aucun fichier donné sur une ligne de commande. Exemple
jfs
fileinput.input () ne peut pas bien gérer les fichiers sans nouvelle ligne à la fin, la dernière fois que j'ai vérifié.
Zachary Vance
il demande en script shell, pas en python autre langage. Avec JQ peut le faire parfaitement.
Bui Anh Tuan
65

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

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

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

Paul Horsfall
la source
6
Notez que cette solution décode les séquences d'échappement unicode "\ uxxxx", contrairement à celle en Python avec json.tool. Cependant, il semble également avoir des limites de profondeur d'imbrication ( nesting of 20 is too deep (JSON::NestingError)).
a3nm
2
sur Ubuntu vous pouvez faire: sudo apt-get install ruby-json-pureau lieu degem install
Janus Troelsen
1
`` `eric-mbp: ~ ericstob $ sudo gem install json Mot de passe: Récupération: json-1.7.3.gem (100%) Construction d'extensions natives. Cela peut prendre un certain temps ... Installation réussie de json-1.7.3 1 gem installé Installation de la documentation ri pour json-1.7.3 ... Installation de la documentation RDoc pour json-1.7.3 ... eric-mbp: ~ ericstob $ prettify_json .rb -bash: prettify_json.rb: commande introuvable
Eric Hartford
peut-être pourriez-vous publier le contenu de votre prettify_json.rb?
Andrew
Vous pouvez télécharger le script, déplacez - le à votre ~/bindossier (assurez - vous qu'il est dans votre PATH) renommage prettify_json.rbà ppjet exécuter chmod +x ppj. Maintenant, vous pouvez faire quelque chose commecurl www.jsonsring.com/something.json | ppj
Uri
58

MISE À JOUR J'utilise jqmaintenant 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:

Jolies réponses de service Web imprimées comme ceci:

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

et embellissez les fichiers qui circulent sur votre disque:

jsonpp data/long_malformed.json

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.

jordelver
la source
1
J'ai essayé jsonpp (utilisé dans le passé avec succès) contre un énorme fichier (> 60 Mo). Je l'ai arrêté après 5min. Je l'ai inséré python -mjson.tool(à partir d'une autre réponse ici) et il a fallu 10 à 20 secondes ...
volker
60 Mo de JSON? Hou la la! Je ne traite généralement pas de fichiers aussi volumineux mais utiles à connaître. Merci.
jordelver
Sur ma boîte Ubuntu, j'ai un 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 celui jsonppmentionné ici
davidpricedev
56

Voilà comment je le fais:

curl yourUri | json_pp

Il raccourcit le code et fait le travail.

JedatKinports
la source
3
Serveur Ubuntu: si vous avez des machines de production avec des installations très restreintes, cela peut être le meilleur choix car il est installé par défaut sous un nom spécifique. Python est souvent installé de différentes manières (par exemple python3, python ou pas du tout) selon la version.
jonathanjo
55

un simple script bash pour une jolie impression json

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}'

Exemple:

cat file.json | json_pretty.sh
Evgeny Karpov
la source
1
Merci pour les commentaires. Je viens d'écrire ce script aujourd'hui pour un usage personnel et cela a bien fonctionné dans mes cas. J'ai fait des corrections, maintenant c'est plus petit et sans ce problème. Il n'y a pas d'objectif de prendre en charge complètement le format, mais je peux apporter d'autres correctifs si nécessaire.
Evgeny Karpov
2
Ce n'est que la réponse de travail que j'ai trouvée. J'ai un linux intégré - pas de rubby, pas de javascript, pas d'accès à Internet pour télécharger des modules python ... J'ai un awk légèrement différent qui ne prend pas en charge la %*cnotation, j'ai donc changé le printfen c=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 /[]}]/.
Zaboj Campula
2
Cela devrait être accepté, car il est entièrement natif et ne nécessite pas de logiciel tiers ...
Blag
1
@EvgenyKarpov belle prise, pas besoin d'un retour en arrière complet, juste celui grepqui a été effacé par erreur;)
Blag
1
Merci mec, je voulais un moyen rapide de formater un json à une ligne de 8 Mo, en simple bash.
Ahmed M
53

Essayez pjson. Il a des couleurs!

echo '{"json": "obj"} |  pjson

Installez-le avec pip:

⚡ pip install pjson

Et dirigez ensuite tout contenu JSON vers pjson.

Johann Philipp Strathausen
la source
Il nécessite python-pip (sudo apt-get install python-pip) puis (sudo pip install pjson) Le grand avantage sont les couleurs!
Kristjan Adojaan
1
L'inconvénient est qu'il n'est pas possible de grep la sortie colorée.
Kristjan Adojaan
51
$ echo '{ "foo": "lorem", "bar": "ipsum" }' \
> | python -c'import fileinput, json;
> print(json.dumps(json.loads("".join(fileinput.input())),
>                  sort_keys=True, indent=4))'
{
    "bar": "ipsum",
    "foo": "lorem"
}

REMARQUE: ce n'est pas la façon de procéder.

La même chose en Perl:

$ cat json.txt \
> | perl -0007 -MJSON -nE'say to_json(from_json($_, {allow_nonref=>1}), 
>                                     {pretty=>1})'
{
   "bar" : "ipsum",
   "foo" : "lorem"
}

Remarque 2: si vous exécutez

echo '{ "Düsseldorf": "lorem", "bar": "ipsum" }' \
| python -c'import fileinput, json;
print(json.dumps(json.loads("".join(fileinput.input())),
                 sort_keys=True, indent=4))'

le mot bien lisible devient \ u encodé

{
    "D\u00fcsseldorf": "lorem", 
    "bar": "ipsum"
}

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

echo '{ "Düsseldorf": "lorem", "bar": "ipsum" }' \
| python -c'import fileinput, json;
print json.dumps(json.loads("".join(fileinput.input())),
                 sort_keys=True, indent=4, ensure_ascii=False)'

et vous obtiendrez:

{
    "Düsseldorf": "lorem", 
    "bar": "ipsum"
}
JF Sebastian
la source
en fait je fais de même mais avec javascript lui-même :)
Robert Gould
2
Dans la version du module JSON que j'ai, to_jsonne semble pas accepter les options. Mais cela fonctionne:perl -MJSON -nE 'say JSON->new->pretty->encode(from_json $_)' text.json
Rörd
L'exemple Python pourrait être simplifié. Il est beaucoup plus facile de diriger directement la sortie JSON python -m json.tool.
Dan Loewenherz
@Dan: oui. Et il y a plusieurs réponses qui montrent json.tooldes exemples de code. 1. cette version vous permet de modifier certains paramètres, par exemple, indent2. Au moment de la publication (2008) Python 2.4 était toujours utilisé et ne prend pas en charge-mjson.tool
jfs
40

J'utilise jshon pour faire exactement ce que vous décrivez. Exécutez simplement:

echo $COMPACTED_JSON_TEXT | jshon

Vous pouvez également transmettre des arguments pour transformer les données JSON.

yardena
la source
Merci, jshon est beaucoup plus rapide que d'utiliser python ou ruby ​​pour la même tâche
Alexander
2
@Alexander - À quelle vitesse avez-vous besoin d'une jolie imprimante? Je suis sur OSx Lion fourni avec Python préinstallé. Avec python -mjson.tool, je peux assez imprimer un fichier json de 96 Ko en 0,1 s - la sortie json de earthporn à laquelle jshon est lié est d'environ 24 Ko et je peux assez bien l'imprimer en 0,08 s. À quel point jshon est-il plus rapide pour vous?
joensson
1
Je travaille avec des fichiers de données JSON compressés de 1 + Go (qui sait même la taille non compressée), donc j'apprécie beaucoup la suggestion selon laquelle jshon est plus rapide.
Ryan Ballantyne
38

Ou, avec Ruby:

echo '{ "foo": "lorem", "bar": "ipsum" }' | ruby -r json -e 'jj JSON.parse gets'
darscan
la source
Cela me donne une erreur. Avez-vous besoin d'un paquet ruby ​​json installé?
mjs
3
Oui, vous avez besoin de JSON Ruby Gem: sudo gem install json
darscan
@MatSchaffer Notez que cela ne fonctionne pas si vous utilisez JSON pour sérialiser des objets avec des to_jsonméthodes personnalisées ; Kernel#jjseuls les tableaux jolis et les hachages identiques (ou les nombres / chaînes / booléens).
Phrogz
Sous Windows, essayez ceci: echo { "foo": "lorem", "bar": "ipsum" } | ruby -r json -e 'jj JSON.parse gets'
Ross Attrill
36

Découvrez Jazor . Il s'agit d'un simple analyseur JSON en ligne de commande écrit en Ruby.

gem install jazor
jazor --help
Mike Conigliaro
la source
4
Est-ce juste moi ou est-ce la seule suggestion qui répond réellement à la question du PO? Je suis venu ici à la recherche d'une commande simple dans laquelle je pouvais diriger la sortie curlet c'est la seule qui l'a fait pour moi.
Leo Cassarani
2
J'aime qu'il ait la possibilité de coloriser la sortie. Cela le rend plus facile à lire.
Andrew
ooh j'aime aussi l'option de passer une URL car j'utilise ceci pour voir la sortie de mon API REST
Andrew
35

Vous pouvez utiliser cette commande simple pour obtenir le résultat:

echo "{ \"foo\": \"lorem\", \"bar\": \"ipsum\" }"|python -m json.tool
Arpit Rathod
la source
Meilleure réponse à mon avis. Petit et facile à retenir et ne nécessite l'installation d'aucun outil non standard.
Eugene C
python -m json.tool ne semble pas conserver l'ordre de l'objet JSON.
pushNpop
31

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.

npm install jsonlint -g

et alors

jsonlint -p myfile.json

ou

curl -s "http://api.twitter.com/1/users/show/user.json" | jsonlint | less
Salman A
la source
28

Dirigez simplement la sortie vers jq ..

Exemple:

twurl -H ads-api.twitter.com '.......' | jq .
Benjamin W.
la source
Belle réponse @Ackshaey Singh et on peut rediriger la même chose facilement vers un fichier également. par exemplecat <file_name.txt> | jq . > <output_name.txt>
Pramit
9
brew install jqsi vous êtes sous mac os.
Distwo
1
Malheureusement, l'utilisation 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.
pic
2
@Pramit cat file |est invariablement une perte de processus; juste faire jq . <file_name.txt >output_name.txt(avec littéral <et >caractères).
Mark Reed
25

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:

[pdurbin@beamish ~]$ echo '{"foo": "lorem", "bar": "ipsum"}' | json_pp
{
   "bar" : "ipsum",
   "foo" : "lorem"
}

Il convient de mentionner qu'il json_ppest préinstallé avec Ubuntu 12.04 (au moins) et Debian dans/usr/bin/json_pp

Philip Durbin
la source
24

Pygmentize

Je combine json.tool de Python avec pygmentize:

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

Il existe quelques alternatives à pygmentize qui sont répertoriées dans ma cette réponse .

Voici une démo en direct:

Démo

Shubham Chaudhary
la source
5
Parfois, il faut utiliser pygmentize -l jsonpour obtenir la coloration.
JP
Installer avec le paquet apt python-pygments, soitapt-get install python-pygments
janvier
19

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:

sudo apt-get install libjson-xs-perl

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:

$ curl -s http://page.that.serves.json.com/json/ | json_xs

ou ca:

$ wget -q -O - http://page.that.serves.json.com/json/ | json_xs

et pour formater le JSON contenu dans un fichier, vous pouvez le faire:

$ json_xs < file-full-of.json

Pour reformater en YAML , que certaines personnes considèrent comme plus lisible humainement que JSON:

$ json_xs -t yaml < file-full-of.json
htaccess
la source
19

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é):

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

L'énorme avantage de jq est qu'il peut faire beaucoup plus si vous souhaitez analyser et traiter le json.

Schmitzi
la source
json_pp était sur mon Mac - mais pas jq. Merci!
David H
1
@DavidH - est-ce utile: stackoverflow.com/questions/37668134/…
Schmitzi
Merci! Je n'avais jamais entendu parler de jq auparavant.
David H
17

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

jj -p # for reading from STDIN

ou

jj -p -i input.json

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.

pointe
la source
16
  1. brew install jq
  2. command + | jq
  3. (exemple: curl localhost:5000/blocks | jq)
  4. Prendre plaisir!

entrez la description de l'image ici

alexanderjsingleton
la source
16

batest un catclone avec une coloration syntaxique:

Exemple:

echo '{"bignum":1e1000}' | bat -p -l json

-paffichera sans en-têtes et -lspé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?

Grav
la source
12

Installez yajl-tools avec la commande ci-dessous:

sudo apt-get install yajl-tools

puis,

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

Uma sankar pradhan
la source
Impressionnant. Ne nécessite pas d'autre langue / interprète et est dans le référentiel du package, pas besoin de brasser!
Joseph Lust