In questo articolo
Cos'è JSONPath?
JSONPath è un linguaggio di query per estrarre dati da documenti JSON. Proprio come XPath naviga i documenti XML, JSONPath naviga le strutture JSON usando una sintassi di espressioni concisa. È stato formalizzato in RFC 9535 (febbraio 2024) dopo anni di specifiche informali.
Le espressioni JSONPath iniziano con $ (l'elemento radice) e usano la notazione a punto o la notazione a parentesi per attraversare il documento. Il linguaggio supporta i caratteri jolly, la discesa ricorsiva, il taglio degli array e le espressioni di filtro — rendendo possibile estrarre valori profondamente annidati con una singola espressione.
Sintassi JSONPath
JSONPath fornisce diversi operatori per navigare e filtrare le strutture JSON.
- Radice ($) — ogni espressione JSONPath inizia con $ che rappresenta l'oggetto o l'array radice del documento JSON
- Notazione a punto ($.store.book) — accede alle proprietà figlio per nome, simile all'accesso agli oggetti JavaScript. I punti separano ogni livello di annidamento.
- Notazione a parentesi ($['store']['book']) — sintassi alternativa che usa nomi di proprietà tra virgolette nelle parentesi. Obbligatoria quando i nomi delle proprietà contengono caratteri speciali o spazi.
- Jolly (*) — corrisponde a tutti gli elementi al livello corrente. $.store.* restituisce tutti i figli diretti di store; $[*] restituisce tutti gli elementi di un array radice.
- Discesa ricorsiva (..) — cerca tutti i discendenti a qualsiasi profondità. $..price trova ogni campo 'price' ovunque nel documento, indipendentemente dal livello di annidamento.
- Sezioni di array ([start:end:step]) — selezionano un intervallo di elementi dell'array. $[0:3] restituisce i primi tre elementi; $[-2:] restituisce gli ultimi due; $[::2] restituisce ogni secondo elemento.
Esempi di espressioni JSONPath
Ecco esempi pratici che mostrano come le espressioni JSONPath estraggono dati da strutture JSON reali.
- Estrazione di valori annidati — $.users[0].name recupera il nome del primo utente. $.config.database.host ottiene un valore di configurazione profondamente annidato.
- Filtraggio di array — $.users[?(@.age > 18)] restituisce tutti gli utenti con più di 18 anni. $.products[?(@.price < 50)] trova prodotti convenienti. I filtri usano @ per fare riferimento all'elemento corrente.
- Query multilivello — $..author restituisce ogni campo author a qualsiasi profondità. $.store.book[*].title restituisce tutti i titoli dei libri. $.orders[*].items[*].sku estrae gli SKU da tutti gli ordini e articoli.
Queste espressioni possono essere combinate per creare query potenti. Ad esempio, $.store.book[?(@.price < 10)].title restituisce i titoli di tutti i libri che costano meno di 10.
Prova gratuitamente — nessuna registrazione richiesta
Testa espressioni JSONPath →Casi d'uso comuni
JSONPath viene utilizzato ovunque sia necessario interrogare o estrarre dati strutturati da documenti JSON.
- Estrazione delle risposte API — estrai campi specifici da risposte API complesse senza scrivere codice di analisi personalizzato. Testa le espressioni su risposte di esempio prima di codificare.
- Analisi della configurazione — estrai valori dai file di configurazione JSON nelle pipeline CI/CD, negli script di distribuzione e negli strumenti di infrastructure-as-code
- Analisi dei log — interroga i log JSON strutturati per trovare eventi specifici, pattern di errore o metriche di prestazione in file di log di grandi dimensioni
- Trasformazione dei dati — usa JSONPath nelle pipeline ETL per selezionare, filtrare e rimodellare i dati JSON durante le operazioni di importazione/esportazione
JSONPath vs JQ vs JMESPath
Diversi linguaggi di query si rivolgono ai documenti JSON. Ognuno ha diversi punti di forza e supporto ecosistemico.
- JSONPath — sintassi di query standard (RFC 9535), ampiamente supportata nelle librerie di programmazione (Java, Python, JavaScript, PHP). Il migliore per estrazione e filtraggio semplici. Nessuna trasformazione integrata.
- JQ — processore JSON da riga di comando con un potente linguaggio funzionale. Supporta trasformazione, computazione e formattazione dell'output. Il migliore per lo scripting di shell e l'elaborazione dei dati da riga di comando.
- JMESPath — linguaggio di query utilizzato da AWS CLI e Boto3. Sintassi più rigorosa di JSONPath con funzioni integrate. Il migliore per l'integrazione con l'ecosistema AWS e le query programmatiche.
Domande frequenti
JSONPath usa l'indicizzazione degli array con base zero o con base uno?
JSONPath usa l'indicizzazione degli array con base zero, coerente con la maggior parte dei linguaggi di programmazione. $[0] restituisce il primo elemento, $[1] restituisce il secondo e così via. Gli indici negativi contano dalla fine: $[-1] restituisce l'ultimo elemento, $[-2] restituisce il penultimo.
Come funzionano le espressioni di filtro in JSONPath?
Le espressioni di filtro usano la sintassi [?(expression)] dove @ fa riferimento all'elemento corrente in fase di valutazione. Puoi usare operatori di confronto (==, !=, <, >, <=, >=), operatori logici (&& e ||) e accesso alle proprietà (ad es., @.name). Esempio: $[?(@.status == 'active')] restituisce gli elementi dove status è uguale a 'active'.
Tutte le implementazioni JSONPath sono compatibili?
Non del tutto. Prima di RFC 9535 (2024), JSONPath non aveva uno standard formale e le implementazioni variavano. Le differenze comuni includono la sintassi delle espressioni di filtro, il comportamento della discesa ricorsiva e la gestione delle proprietà mancanti. RFC 9535 mira a standardizzare il comportamento, ma le librerie più vecchie potrebbero ancora seguire convenzioni diverse. Testa sempre le espressioni con la tua implementazione specifica.