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?
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($_))'
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 ...
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/
J'ai créé un module spécialement conçu pour la manipulation JSON en ligne de commande:
https://github.com/ddopson/underscore-cli
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.
Il y a aussi boîte à outils de traitement de ligne de commande JSON s'il vous arrive d'avoir node.js et npm dans votre pile.
Et un autre "commande json" pour masser JSON sur votre ligne de commande Unix.
Et voici les autres alternatives:
Connexes: Outil de ligne de commande pour l'analyse de l'entrée JSON pour Unix?
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"]``
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.
Vous pouvez essayer jsawk comme suggéré dans cette réponse .
Vraiment, vous pouvez créer un rapide script python pour le faire cependant).
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.
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"
}