§

Testa le espressioni JSONPath

Formato di output:
Riferimento rapido JSONPath
Token Meaning
$Elemento radice del documento
@Elemento corrente (usato nelle espressioni di filtro)
.Operatore membro figlio: seleziona un figlio con nome
..Discesa ricorsiva: cerca in tutti i discendenti
*Wildcard: corrisponde a qualsiasi elemento o proprietà
[*]Tutti gli elementi di un array
[n]Elemento dell'array all'indice n (a base zero)
[start:end]Slice dell'array da start fino a (non incluso) end
[?(@.x)]Filtro: elementi dove esiste la proprietà x
[?(@.x==1)]Filtro: elementi dove la proprietà x è uguale a 1
[(@.length-1)]Espressione script: ultimo elemento di un array

JSONPath compare ovunque un contratto API debba essere verificato rispetto a un payload reale. I team fintech italiani che scrivono suite di regressione Postman asseriscono i campi di risposta con JSONPath nella scheda Test, gli script di load test k6 estraggono valori dalle risposte API con jsonpath() per verificare le soglie SLA all'interno dei blocchi check(), e i runbook di guardia SRE usano espressioni di filtro come [?(@.status=="error")] per suddividere i log JSON di CloudWatch prima dell'escalation. Eseguire quelle espressioni in una scheda del browser mantiene i payload di fixture proprietari, i dati PII dei clienti e le risposte API pre-rilascio fuori da qualsiasi servizio di query ospitato.

Cos'è JSONPath?

JSONPath è un linguaggio di query per i documenti JSON, l'equivalente JSON di XPath per XML. Stefan Goessner lo ha proposto nel 2007 come un modo breve e leggibile per puntare a un nodo all'interno di un albero JSON senza scrivere un parser. Un'espressione inizia con il selettore radice $ e concatena accessor di proprietà, indici di array, wildcard, discesa ricorsiva e condizioni di filtro fino a selezionare i nodi desiderati. Nel 2024 l'IETF ha pubblicato RFC 9535 per standardizzare la sintassi che si era frammentata tra le implementazioni; questo tester funziona su jsonpath-plus, un'implementazione JavaScript ampiamente utilizzata che copre la bozza Goessner, la maggior parte di RFC 9535 e alcuni operatori di estensione aggiuntivi.

Come funziona JSONPath

Un'espressione JSONPath si legge da sinistra a destra e percorre un documento JSON un passo alla volta. Ogni passo prende l'insieme dei nodi sopravvissuti al passo precedente e lo restringe ulteriormente. La pipeline di valutazione completa:

  1. Ancorare con il selettore radice $. Ogni espressione inizia qui, puntando al valore di primo livello, che si tratti di un oggetto o di un array. I nomi di proprietà nudi senza un $ iniziale non sono JSONPath validi.
  2. Entrare nei membri figlio con la notazione a punto ($.store.book) o la notazione a parentesi ($['store']['book']). La notazione a parentesi è richiesta quando una chiave contiene uno spazio, un trattino o qualsiasi carattere che non sia un identificatore valido.
  3. Cercare in ogni livello contemporaneamente con l'operatore di discesa ricorsiva ... L'espressione $..author raccoglie ogni valore author ovunque nell'albero, indipendentemente dalla profondità. Questo è l'operatore che JMESPath non ha.
  4. Selezionare gli elementi dell'array per indice ([0], [-1] per l'ultimo elemento in jsonpath-plus), suddividerli con la notazione [start:end] ([0:3] restituisce i primi tre), oppure selezionare ogni elemento con il wildcard [*].
  5. Filtrare gli elementi con un predicato all'interno di [?(...)]. All'interno del predicato, @ si riferisce all'elemento corrente, quindi [?(@.price<10)] mantiene solo gli elementi il cui campo price è inferiore a 10. I filtri si compongono con il resto del percorso, quindi puoi filtrare poi scendere, o scendere poi filtrare.
  6. Scegliere il formato di output. Valori restituisce i dati corrispondenti stessi. Percorsi restituisce il JSONPath di ogni corrispondenza così puoi vedere cosa ha risolto il motore. Puntatori restituisce il RFC 6901 JSON Pointer equivalente per ogni corrispondenza, utile quando il consumatore a valle è JSON Patch o un validatore JSON Schema.

Perché usare questo JSONPath tester?

  • Il tuo JSON non lascia mai il browser. La query viene eseguita all'interno della pagina, quindi i fixture di produzione, i dati PII dei clienti e le risposte API pre-rilascio rimangono sulla tua macchina.
  • Il motore è jsonpath-plus 9.x, la stessa libreria che supporta molte suite di test di produzione e asserzioni CI. I risultati che vedi qui corrispondono ai risultati che vedrà la tua pipeline di build.
  • Tre modalità di output coprono i consumatori a valle comuni: Valori grezzi per copia-incolla, Percorsi per il debug della risoluzione del motore, e Puntatori RFC 6901 per i flussi di lavoro JSON Patch e JSON Schema.
  • Le espressioni di filtro vengono eseguite con preventEval: true, quindi una query incollata non può eseguire JavaScript arbitrario sulla pagina host. Questo è importante quando l'espressione viene da un messaggio Slack, un ticket Jira o gli appunti di un collega.

Applicazioni comuni di JSONPath

JSONPath compare ovunque il codice debba estrarre un campo da un payload JSON senza scrivere manualmente una discesa ricorsiva:

  • Test Postman: la scheda Tests in Postman espone pm.response.json() insieme all'accesso in stile JSONPath per le asserzioni. I team scrivono una singola espressione come $.data.user.email per estrarre un campo da una risposta e asserire su di esso in CI.
  • Load test k6: gli script k6 chiamano jsonpath() all'interno di un blocco check() per estrarre valori dai corpi delle risposte e asserire le soglie SLA. La stessa espressione che ha provato un contratto in Postman può verificare un load test in k6.
  • DSL JSON per trasformazioni di dati: AWS Step Functions valuta JSONPath all'interno di InputPath, ResultPath e Parameters per rimodellare i payload degli eventi tra gli stati. Argo Workflows usa JSONPath in withParam per distribuire i task su un array. Kubernetes kubectl -o jsonpath usa la stessa sintassi per estrarre campi dagli oggetti del cluster.

Esempio pratico

Il fixture canonico di Goessner è il documento del negozio di libri con quattro libri, ognuno con category, author, title e price. Su quel fixture, l'espressione $.store.book[?(@.price<10)].title viene eseguita in tre passi. Prima, $.store.book si risolve nell'array di tutti e quattro i libri. Poi, il filtro [?(@.price<10)] mantiene solo il libro con prezzo inferiore a 10 (la voce a 8,95). Infine, .title estrae il titolo di quel libro. Il risultato è ["Sayings of the Century"]. Passare a Percorsi restituisce ["$['store']['book'][0]['title']"], e Puntatori restituisce ["/store/book/0/title"].

Crea i tuoi prototipi di espressioni qui, poi inseriscili direttamente in Postman, k6, kubectl o una macchina a stati Step Functions. Incolla, interroga, copia. Nulla attraversa la rete.

Cos'è JSONPath?

JSONPath è un linguaggio di query per i documenti JSON, analogo a XPath per XML. Proposto da Stefan Goessner nel 2007 e standardizzato dall'IETF come RFC 9535 nel 2024, utilizza una sintassi di espressione compatta che inizia con $ (la radice del documento) e supporta la notazione a punto, gli indici di array, i wildcard, le slice, la discesa ricorsiva (..) e le espressioni di filtro ([?(...)]) per selezionare i nodi all'interno di un albero JSON.

In cosa si differenzia JSONPath da JMESPath o jq?

Tutti e tre interrogano JSON, ma le loro grammatiche e i loro obiettivi differiscono. JMESPath è lo standard AWS CLI / SDK: più rigoroso di JSONPath, nessuna discesa ricorsiva, costruito per una proiezione prevedibile senza effetti collaterali. jq è un linguaggio di scripting Turing-completo che non solo interroga JSON ma lo trasforma, riduce e trasmette in streaming. JSONPath si trova tra i due: più espressivo di JMESPath grazie alla discesa ricorsiva e ai filtri, più leggero di jq, e la sintassi più ampiamente supportata negli strumenti di test generici (Postman, Playwright, REST Assured, kubectl, Step Functions). Questo tester implementa JSONPath.

Quale dialetto usa questo tester?

Questo tester esegue jsonpath-plus 9.x. Quella libreria implementa la specifica Goessner 2007, copre la maggior parte di RFC 9535 e aggiunge operatori di estensione come controlli di tipo (@.string(), @.number(), @.boolean()) e navigazione parentale (^). Il flag preventEval: true è sempre impostato, quindi i predicati di filtro vengono eseguiti attraverso un interprete sicuro anziché la funzione integrata JavaScript eval(). Una query incollata non può eseguire codice arbitrario su questa pagina.

Posso copiare singoli valori corrispondenti?

Sì. Il pulsante Copia negli appunti copia il blocco risultato completo come array JSON. Per prendere un singolo valore, passa la modalità di output a Valori, poi seleziona la riga che vuoi nella textarea del risultato e usa il normale collegamento di copia del browser (Ctrl/Cmd + C). L'output è testo JSON normale, quindi si incolla in modo pulito in un editor di codice, un terminale, un test Postman o un messaggio Slack.