Qualcuno può raccomandare un parser JSON Unix (scegli il tuo sapore) che potrebbe essere usato per introspettare i valori da una risposta JSON in una pipeline?
Qualcuno può raccomandare un parser JSON Unix (scegli il tuo sapore) che potrebbe essere usato per introspettare i valori da una risposta JSON in una pipeline?
Risposte:
Puoi usare questo parser da riga di comando (che potresti mettere in un alias bash se vuoi), usando i moduli integrati nel core Perl:
perl -MData::Dumper -MJSON::PP=from_json -ne'print Dumper(from_json($_))'
perl -e "use JSON; print to_json( decode_json(<>), { pretty => 1 } )"
Preferisco python -m json.tool
che sembra essere disponibile per impostazione predefinita sulla maggior parte dei sistemi operativi * nix per impostazione predefinita.
$ echo '{"foo":1, "bar":2}' | python -m json.tool
{
"bar": 2,
"foo": 1
}
Ma va notato che questo ordinerà tutti i tasti in ordine alfabetico, che è o può essere una buona cosa in cui il json è stato generato da un linguaggio che utilizzava HashMaps non ordinate ...
json.tool
è solo una scorciatoia per stampare piuttosto json. Se hai bisogno di estrarre / manipolare i dati json in uno script di shell, jq
json.tool
dieci volte al giorno. Penso di aver letto male il significato di "introspec" nella domanda, grazie per la tua precisazione.
json.tool
fa solo due cose: validare e stampare piuttosto json. Non fa valori introspettivi nel json come jq
fa.
Se stai cercando uno strumento compilato C portatile:
http://stedolan.github.com/jq/
Dal sito Web:
jq è come sed per i dati JSON: puoi usarlo per suddividere, filtrare, mappare e trasformare i dati strutturati con la stessa facilità con cui sed , awk , grep e friends ti permettono di giocare con il testo.
jq può manipolare il formato dei dati che hai in quello che desideri con il minimo sforzo e il programma per farlo è spesso più breve e più semplice di quanto ti aspetteresti.
Tutorial : http://stedolan.github.com/jq/tutorial/
Manuale : http://stedolan.github.com/jq/manual/
Scarica : http://stedolan.github.com/jq/download/
apt install jq
.
jq
.
Ho creato un modulo appositamente progettato per la manipolazione della riga di comando JSON:
https://github.com/ddopson/underscore-cli
Ti permette di fare cose potenti davvero facilmente:
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
E ha uno dei migliori formattatori JSON "smart-whitespace" disponibili:
Se hai richieste di funzionalità, commenta questo post o aggiungi un problema in github. Sarei felice di dare la priorità alle funzionalità che sono necessarie ai membri della community.
wget
ogni URL.
underscore
per l'analisi di json nidificati con oggetti e matrici nidificati?
Esiste anche un toolkit di elaborazione della riga di comando JSON se nel tuo stack sono presenti node.js e npm.
E un altro comando "json" per massaggiare JSON sulla tua riga di comando Unix.
Ed ecco le altre alternative:
Correlati: strumento da riga di comando per l'analisi dell'input JSON per Unix?
npm install json
.
json
sembra essere ora preso in consegna da un pacchetto completamente diverso.
Qualcuno ha menzionato Jshon o JSON.sh?
https://github.com/keenerd/jshon
pipe json e attraversa gli oggetti json e stampa il percorso dell'oggetto corrente (come un array JSON) e quindi l'oggetto, senza spazi bianchi.
http://kmkeen.com/jshon/
Jshon carica il testo json da stdin, esegue le azioni, quindi visualizza l'ultima azione su stdout ed è stato anche fatto parte della normale pipeline di elaborazione del testo.
brew install jshon
,cat *.json | jshon
Puoi provare jsawk come suggerito in questa risposta .
In realtà, però, potresti creare uno script Python per farlo.
Per Bash / Python , ecco un wrapper di base attorno a Python simplejson
:
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
}
Gestisce davvero solo lo stile dei dati del dizionario nidificato, ma funziona per ciò di cui avevo bisogno ed è utile per camminare attraverso il json. Probabilmente potrebbe essere adattato a piacere.
Comunque, qualcosa di fatto in casa per coloro che non vogliono procurarsi un'altra ennesima dipendenza esterna. Tranne il pitone, ovviamente.
Ex. json_parser {field1} {field2}
verrebbe eseguito print myjson['{field1}']['{field2}']
, restituendo le chiavi o i valori associati {field2}
, separati da spazi.
Ho appena creato jkid che è un piccolo esploratore json da riga di comando che ho creato per esplorare facilmente grandi oggetti json. Gli oggetti possono essere esplorati "trasversalmente" e un'opzione di "anteprima" è lì per evitare l'overflow della console.
$ echo '{"john":{"size":20, "eyes":"green"}, "bob":{"size":30, "eyes":"brown"}}' > test3.json
$ jkid . eyes test3.json
object[.]["eyes"]
{
"bob": "brown",
"john": "green"
}
jkid
su Mac?