Question Comment puis-je imprimer JSON dans un script shell (Unix)?


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

Fondamentalement, je le veux pour transformer ce qui suit:

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

... en quelque chose comme ça:

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

2500


origine


Réponses:


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 mettre cela dans .bashrc et il sera disponible chaque fois dans la coquille. Invoquez-le comme prettyjson_s '{"foo": "lorem", "bar": "ipsum"}'.


3734



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. Tu peux trouver leurs tutoriels ici.

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

687



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

À 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"
}

À partir de la ligne de commande Unix avec Node.js, en spécifiant un nom de fichier contenant 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

En utilisant 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));\
 });\
"

358



J'ai écrit un outil qui a l'un des meilleurs formateurs "smart whitespace" disponibles. Il produit une sortie plus lisible et moins verbeuse que la plupart des autres options ici.

underscore-cli

Voici à quoi ressemble un "espace virtuel intelligent":

Je peux être un peu biaisé, mais c'est un outil génial pour l'impression et la manipulation des données JSON à partir de la ligne de commande. Il est très convivial et dispose d'une aide / documentation de ligne de commande étendue. C'est un couteau de l'armée suisse que j'utilise pour 1001 petites tâches différentes qui seraient étonnamment ennuyeuses de faire autrement.

Dernière cas d'utilisation: Chrome, console de développement, onglet Réseau, exporter tout comme fichier HAR, "cat site.har | underscore sélectionner '.url' --outfmt text | grep mydomain"; Maintenant, j'ai une liste chronologique de toutes les recherches d'URL faites lors du chargement du site de mon entreprise.

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 bonnes chances que je les adresse.


321



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 en utilisant un jeton d'authentification:

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

168



Merci aux conseils très utiles de J.F. 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))

82



Sur * nix, la lecture de stdin et l'écriture sur 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" après AnCla réponse) dans votre PATH et chmod +x et vous êtes prêt à partir.


66



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

Prétendre le fichier JSON src.jsonà pretty.json:

< src.json json_xs > pretty.json

Si vous n'avez pas json_xs, essayez json_pp . "pp" est pour "pure perl" - l'outil est implémenté en Perl seulement, sans une liaison à une bibliothèque C externe (ce qui est ce que XS signifie, "Extension System" de Perl).


65



Le JSON Ruby Gem est livré avec un script shell pour simuler JSON:

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

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


63



Si vous utilisez npm et Node.js, vous pouvez le faire npm install -g json puis tuyau la commande à travers json. Faire 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

63



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

Par exemple:

cat xxx | jq .

55