web-dev-qa-db-fra.com

Analyseur JSON en ligne de commande Unix?

Quelqu'un peut-il recommander un analyseur JSON Unix (à votre goût) pouvant être utilisé pour analyser les valeurs d'une réponse JSON dans un pipeline?

119
Jé Queue

Vous pouvez utiliser cet analyseur de ligne de commande (que vous pourriez mettre dans un alias bash si vous le souhaitez), à l'aide de modules intégrés au noyau Perl:

Perl -MData::Dumper -MJSON::PP=from_json -ne'print Dumper(from_json($_))'
15
Ether

Je préfère python -m json.tool qui semble être disponible par défaut sur la plupart des systèmes d'exploitation * nix par défaut.

$ echo '{"foo":1, "bar":2}' | python -m json.tool
{
    "bar": 2, 
    "foo": 1
}

Mais il faut noter que cela va trier toutes les clés par ordre alphabétique, ce qui est ou peut être une bonne chose lorsque le json a été généré par une langue qui utilisait des HashMaps non ordonnés ...

223
muhqu

Si vous recherchez un outil portable compilé en C:

http://stedolan.github.com/jq/

Sur le site:

jq est comme sed pour les données JSON - vous pouvez l’utiliser pour découper, filtrer, mapper et transformer des données structurées avec la même facilité que sed, awk, grep et amis vous permettent de jouer avec du texte.

jq peut modifier très facilement le format de données que vous avez en celui que vous souhaitez, et le programme utilisé pour le faire est souvent plus court et plus simple que prévu.

Didacticiel : http://stedolan.github.com/jq/tutorial/
Manuel : http://stedolan.github.com/jq/manual/
Télécharger : http://stedolan.github.com/jq/download/

135
Daan Mortier

J'ai créé un module spécialement conçu pour la manipulation JSON en ligne de commande:

https://github.com/ddopson/underscore-cli

  • [~ # ~] flexible [~ # ~] - L'outil "swiss-army-knife" pour le traitement de données JSON - peut être utilisé simplement pretty-printer ou une ligne de commande Javascript pleine de puissance
  • [~ # ~] puissant [~ # ~] - Expose toute la puissance et la fonctionnalité de underscore.js (plus underscore.string)
  • [~ # ~] simple [~ # ~] - Simplifie l'écriture de lignes simples JS similaire à l'utilisation de "Perl -pe"
  • [~ # ~] chaîné [~ # ~] - Il est possible de chaîner plusieurs invocations de commande pour créer un pipeline de traitement de données.
  • MULTI-FORMAT - Prise en charge étendue des formats d'entrée/de sortie - jolies impressions, JSON strict, etc. [à venir]
  • [~ # ~] documenté [~ # ~] - Excellente documentation en ligne de commande avec plusieurs exemples pour chaque commande.

Cela vous permet de faire des choses puissantes très facilement:

cat earthporn.json | underscore select '.data .title'
# [ 'Fjaðrárgljúfur canyon, Iceland [OC] [683x1024]',
#   'New town, Edinburgh, Scotland [4320 x 3240]',
#   'Sunrise in Bryce Canyon, UT [1120x700] [OC]',
# ...
#   'Kariega Game Reserve, South Africa [3584x2688]',
#   'Valle de la Luna, Chile [OS] [1024x683]',
#   'Frosted trees after a snowstorm in Laax, Switzerland [OC] [1072x712]' ]

cat earthporn.json | underscore select '.data .title' | underscore count
# 25

underscore map --data '[1, 2, 3, 4]' 'value+1'
# prints: [ 2, 3, 4, 5 ]

underscore map --data '{"a": [1, 4], "b": [2, 8]}' '_.max(value)'
# [ 4, 8 ]

echo '{"foo":1, "bar":2}' | underscore map -q 'console.log("key = ", key)'
# key = foo
# key = bar

underscore pluck --data "[{name : 'moe', age : 40}, {name : 'larry', age : 50}, {name : 'curly', age : 60}]" name
# [ 'moe', 'larry', 'curly' ]

underscore keys --data '{name : "larry", age : 50}'
# [ 'name', 'age' ]

underscore reduce --data '[1, 2, 3, 4]' 'total+value'
# 10

Et il dispose de l’un des meilleurs systèmes de formatage JSON "smart-whitespace":

Si vous avez des demandes de fonctionnalités, commentez ce message ou ajoutez un problème dans github. Je serais heureux de donner la priorité aux fonctionnalités dont les membres de la communauté ont besoin.

60
Dave Dopson
12
zpoley

Commander TickTick .

C'est un véritable analyseur Bash JSON.

#!/bin/bash
. /path/to/ticktick.sh

# File
DATA=`cat data.json`
# cURL
#DATA=`curl http://foobar3000.com/echo/request.json`

tickParse "$DATA"

echo ``pathname``
echo ``headers["user-agent"]``
12
CoolAJ86

Quelqu'un a mentionné Jshon ou JSON.sh?

https://github.com/keenerd/jshon

dirigez-le vers json, qui traverse les objets json et affiche le chemin d'accès à l'objet actuel (sous forme de tableau JSON), puis à l'objet, sans espace.

http://kmkeen.com/jshon/
Jshon charge le texte JSON à partir de stdin, exécute des actions, puis affiche la dernière action sur stdout. Il fait également partie du pipeline de traitement de texte habituel.

8
hewigovens

Vous pouvez essayer jsawk comme suggéré dans cette réponse .

Vraiment, vous pouvez créer un rapide script python pour le faire cependant).

2
NG.

Pour Bash/Python, voici un wrapper de base autour de simplejson de python:

json_parser() {
    local jsonfile="my_json_file.json"
    local tc="import simplejson,sys; myjsonstr=sys.stdin.read(); "`
            `"myjson=simplejson.loads(myjsonstr);"
    # Build python print command based on $@
    local printcmd="print myjson"
    for (( argn=1; argn<=$#; argn++ )); do
        printcmd="$printcmd['${!argn}']"
    done
    local result=$(python -c "$tc $printcmd.keys()" <$jsonfile 2>/dev/null \
        || python -c "$tc $printcmd" <$jsonfile 2>/dev/null)
    # For returning space-separated values
    echo $result|sed -e "s/[]|[|,|']//g"
    #echo $result 
}

Il ne gère que le style de données du dictionnaire imbriqué, mais il fonctionne pour ce dont j'avais besoin et est utile pour parcourir le JSON. Il pourrait probablement être adapté au goût.

Quoi qu'il en soit, quelque chose de chez nous pour ceux qui ne veulent pas trouver de source dans une autre dépendance externe. Sauf pour le python, bien sûr.

Ex. json_parser {field1} {field2} exécuterait print myjson['{field1}']['{field2}'], donnant les clés ou les valeurs associées à {field2}, séparés par des espaces.

1
Aaron R.

Je viens de faire jkid qui est un petit explorateur json en ligne de commande que j'ai créé pour explorer facilement les gros objets json. Les objets peuvent être explorés "transversalement" et une option "aperçu" est là pour éviter le débordement de la console.

$  echo '{"john":{"size":20, "eyes":"green"}, "bob":{"size":30, "eyes":"brown"}}' > test3.json
$  jkid . eyes test3.json 
object[.]["eyes"]
{
  "bob": "brown", 
  "john": "green"
}
0
Arthur