Linux non ha un modo integrato per gestire correttamente JSON, nonostante questo, molte API restituiranno l'output JSON. Prossimo, spiega come analizzare e utilizzare i dati JSON all'interno degli script di shell con una semplice utility.
Analisi di JSON con jq
jq
è un'utilità in grado di gestire tutto ciò che vuoi fare con JSON. È molto facile da installare; scarica semplicemente il binario e spostalo nella tua cartella nel tuo PATH, in genere /usr/local/bin/
. Non ha dipendenze, quindi è solo un binario da scaricare. Ci sono anche download per macOS e Windows.
Iniziare, puoi reindirizzare JSON ad esso per stamparlo abbastanza. Alcune API ridurranno al minimo le tue risposte per risparmiare spazio, cosa causerà questo terribile pasticcio quando? curl
qualcosa sulla console:
Scrivilo su jq
nello stesso modo in cui:
ricciolo https://api.esempio.com/ | jq
E ora è leggibile, con l'evidenziazione della sintassi per l'avvio:
Se dai jq
un comando, lo utilizzerai per scegliere dati al di fuori del JSON, proprio come come sed
operare con il testo. Useremo questo JSONSegnaposto come esempio API per testare i comandi. Per amore della semplicità, lasceremo fuori curl
comando e pipe per mantenere tutto leggibile. Inoltre puoi arricciare una lima e una pipa cat
per jq
, se non fai finta di vedere il curl
output ogni volta che provi un nuovo comando.
Un periodo semplice ‘.
‘Rappresenta i dati incanalati verso jq
. Se vuoi solo ottenere una chiave dell'oggetto, può fare:
jq '.stato'
Puoi anche nidificare questo; come esempio, '.data.geo.host'
restituirebbe un valore più in basso nell'elenco. Facoltativamente, puede agregar un signo de interrogación para verificar errores como “.data.geo?.host
“, Che specifica che la proprietà è facoltativa.
Lavorare con le matrici è dove jq
diventa interessante. Puoi usare le parentesi quadre per ottenere un elemento dell'array specifico. Come esempio, puoi ottenere il nome della prima voce con:
jq'.[0].nome'
Puoi tagliare le matrici usando [2:5]
e usa la stessa sintassi del punto interrogativo per le proprietà opzionali. Anche se nota che se un array è vuoto, non significa che sia una proprietà non valida.
Nonostante questo, probabilmente vuoi ottenere un input specifico in base ai dati che contiene, non in ordine di matrice. Fare quello, passare l'intera matrice al select
utilità:
jq'.[] | Selezionare(.nome | contiene("Leanne"))'
Questo filtra l'array per includere solo gli elementi che superano il test; in questa circostanza, il name
il campo contiene un nome specifico? Può essere qualsiasi espressione booleana, compresa l'aritmetica come select(.count >= 2)
.
Riformattazione JSON
jq
puoi anche creare JSON, il che significa che puoi usarlo per riformattare l'input JSON. Puoi creare oggetti semplicemente avvolgendoli tra parentesi graffe e passando jq
affermazioni come valori. jq
genererà il nuovo oggetto. Come esempio:
gatto json | jq'.[0] | {nome: .nome, società: .società}'
Output molto bene sulla riga di comando:
Anche se questo è utile per rimuovere solo le informazioni che vuoi, puoi anche costruire nuovi oggetti usando jq
comandi.
Per un riferimento completo di tutto jq
sintassi, Puoi controlla il tuo manuale online.
Alternative a jq
Se non vuoi usare un altro programma, puoi usare alcune alternative. Il metodo più semplice è rinunciare a farlo in bash e, Invece, usa un linguaggio di scripting come Python o JavaScript (con nodo) per eseguire l'elaborazione vera e propria. Anziché, Vorrei reindirizzare l'output del comando JSON a un file:
ricciolo https://api/esempio.com/ > json.txt
E poi caricalo in una variabile all'interno dello script per il tuo uso.
Puoi anche usare semplici utilità di selezione del testo; come esempio, se hai solo bisogno di una chiave specifica di una risposta, puoi usare grep insieme a un'espressione regolare per scegliere il valore:
grep "nome" | ma 's/"nome": "(.*)"/1/'
Nonostante questo, questo può (e probabilmente accadrà) molto facilmente con qualsiasi modifica nel JSON. Passare l'API degli utenti, il nome di ogni utente è stato restituito, ma anche il nome utente (che corrispondeva anche a grep), così come il nome della società (che aveva esattamente la stessa chiave). A meno che tu non abbia intenzione di prestare attenzione a tutto questo, dovresti usare qualcosa che sia a conoscenza della struttura JSON, invece di trattarlo come testo.