Utilia

Tester JSONPath

Prova espressioni JSONPath sul tuo JSON nel browser. Filtri, slice, discesa ricorsiva, percorsi e JSON Pointer, con esempi pronti all'uso.

Come provare un’espressione JSONPath

  1. Incolla il tuo JSON in Dati JSON, oppure clicca su Carica i dati di esempio per usare il classico esempio della libreria (bookstore).
  2. Scrivi un’espressione in Espressione JSONPath, oppure scegline una dagli Esempi.
  3. Il risultato si aggiorna mentre scrivi; Esegui la query la rilancia. La riga di stato indica il numero di corrispondenze.
  4. Usa Mostra per passare tra Valori, Percorsi, JSON Pointer e Percorsi e valori, poi copia il risultato.

La sintassi JSONPath in breve

Sintassi Significato Esempio
$ la radice del documento $
.nome o ['nome'] un figlio $.store.bicycle
* ogni figlio $.store.*
.. discesa ricorsiva, a qualsiasi profondità $..author
[n] indice di array, a partire da 0 $..book[2]
[inizio:fine:passo] slice; i numeri negativi contano dalla fine $..book[-1:]
[a,b] unione $..book[0,1]
[?(expr)] filtro $..book[?(@.price < 10)]
^ il genitore di ogni corrispondenza $..book[?(@.price > 20)]^
~ il nome della proprietà invece del valore $.store.*~

I risultati vengono restituiti nell’ordine del documento. Percorsi dà percorsi normalizzati come $['store']['book'][0]['title'], e JSON Pointer dà la forma RFC 6901 /store/book/0/title, comoda per JSON Patch o per i percorsi di errore dei validatori JSON Schema.

Espressioni di filtro: cosa è supportato

I filtri vengono valutati con jsonpath-plus in modalità sicura: l’espressione viene analizzata e interpretata da un piccolo valutatore, mai passata a eval o a new Function. Dentro [?( … )] puoi usare:

  • @ per l’elemento corrente, @.campo e @['campo'] per i suoi membri, @root per l’intero documento ($ non è disponibile dentro un filtro);
  • i confronti ==, !=, ===, !==, <, <=, >, >=;
  • la logica &&, ||, !, l’aritmetica + - * / % e il ternario a ? b : c;
  • letterali di stringa, numero, true, false, null ed espressioni regolari;
  • i metodi dei valori stessi, per esempio @.title.startsWith('S'), @.tags.includes('new') o @.title.match(/lord/i);
  • @property (la chiave o l’indice dell’elemento corrente), @parent e @path (il suo percorso normalizzato), nello stile di jsonpath-plus.

L’accesso a constructor, __proto__ e al costruttore Function è bloccato. Se un filtro fallisce su un elemento, per esempio @.isbn.startsWith('0') su un libro senza isbn, quell’elemento semplicemente non corrisponde; un errore di sintassi nell’espressione viene invece segnalato. I filtri scritti alla maniera della RFC 9535, [?@.price < 10] senza parentesi, sono accettati e letti come [?(@.price < 10)]. Le funzioni della RFC 9535 come length(), count(), match() e search() non sono disponibili: usa invece metodi JavaScript come @.name.length.

Anche i selettori di tipo di jsonpath-plus funzionano alla fine di un percorso: $..*@number() restituisce tutti i numeri, e @string(), @boolean(), @array(), @object(), @null() e @integer() fanno lo stesso per gli altri tipi.

Domande frequenti

Il mio JSON viene inviato a un server?

No. Lettura e valutazione avvengono nel tuo browser, e i tuoi dati non lasciano mai il tuo computer.

Perché il mio filtro non restituisce nulla?

Controlla che il percorso prima del filtro selezioni un array o un oggetto: $.store.book[?(@.price < 10)] filtra i libri, mentre $.store[?(@.price < 10)] guarda book e bicycle. Una proprietà che manca in un elemento vale undefined, quindi i confronti con essa sono falsi.

Che differenza c'è tra `==` e `===`?

Come in JavaScript, == converte i tipi ("10" == 10 è vero) mentre === confronta tipo e valore.

Perché l'output è limitato?

Nel risultato vengono scritte solo le prime 10.000 corrispondenze, per mantenere la pagina reattiva; la riga di stato indica il conteggio completo.

JSONPath è standardizzato?

Sì, dal 2024, con la RFC 9535. Le implementazioni però differiscono ancora, soprattutto nei filtri; questo strumento segue jsonpath-plus, la sintassi del JSONPath originale di Stefan Goessner.