Appendix B. Inspired by XPath (Ispirato a XPath)
Appendix B. Inspired by XPath (Ispirato a XPath)
Questa appendice è informativa.
All'epoca dell'invenzione di JSONPath, XML era noto per la disponibilità di potenti strumenti per analizzare, trasformare ed estrarre selettivamente dati da documenti XML. [XPath] è uno di questi strumenti.
Nel 2007, emerse il bisogno di qualcosa che risolvesse la stessa classe di problemi per la comunità JSON emergente, in particolare per:
- trovare dati in modo interattivo ed estrarli da valori JSON
[RFC8259] senza scripting speciale e
- specificare le parti rilevanti dei dati JSON in una richiesta da parte di un
client, così che il server possa ridurre la quantità di dati nella sua risposta, minimizzando l'uso di banda.
(Nota: XPath si è evoluto dal 2007, e versioni recenti nominalmente supportano persino operare all'interno di valori JSON. Questa appendice discute solo la versione di XPath più diffusa disponibile nel 2007.)
JSONPath riprende la sensazione generale di XPath ma mappa i concetti a sintassi (e parzialmente semantica) familiare a chi usa JSON in un linguaggio dinamico.
Ad esempio, in linguaggi di programmazione dinamici popolari come JavaScript, Python, e PHP, la semantica dell'espressione XPath:
/store/book[1]/title
può essere realizzata nell'espressione:
x.store.book[0].title
o in notazione con parentesi quadre:
x['store']['book'][0]['title']
con la variabile x che tiene l'argomento dell'interrogazione.
Il linguaggio JSONPath è stato progettato per:
-
basarsi naturalmente su quelle caratteristiche del linguaggio,
-
coprire solo le parti più essenziali di XPath 1.0,
-
essere leggero in dimensione del codice e consumo di memoria, e
-
essere efficiente a runtime.
B.1. JSONPath and XPath (JSONPath e XPath)
Le espressioni JSONPath si applicano ai valori JSON come le espressioni XPath sono usate in combinazione con un documento XML. JSONPath usa $ per riferirsi al nodo radice dell'argomento dell'interrogazione, simile a / di XPath all'inizio.
Le espressioni JSONPath scendono nella gerarchia usando la dot notation ($.store.book[0].title) o la bracket notation ($['store']['book'][0]['title']); entrambe sostituiscono / di XPath nelle espressioni di interrogazione, dove la dot notation serve come sintassi leggera ma limitata mentre la bracket notation è una sintassi più pesante ma più generale.
Sia JSONPath sia XPath usano * come jolly. La notazione del segmento discendente di JSONPath, che inizia con .., presa in prestito da [E4X], è simile a // di XPath. Il costrutto di fetta di array [start:end:step] è unico di JSONPath, ispirato da [SLICE] da ECMASCRIPT 4.
Le espressioni di filtro sono supportate tramite la sintassi ?<logical-expr> come in:
$.store.book[[email protected] < 10].title
La Tabella 20 estende la Tabella 1 fornendo un confronto con concetti XPath simili.
| XPath | JSONPath | Descrizione | |
|---|---|---|---|
| / | $ | l'elemento XML radice | |
| . | @ | l'elemento XML corrente | |
| / | . o [] | operatore figlio | |
| .. | n/a | operatore genitore | |
| // | ..name, | discendenti (JSONPath prende | |
| ..[index], ..*, | questa sintassi da E4X) | ||
| o ..[*] | |||
| * | * | jolly: tutti gli elementi XML | |
| indipendentemente dai nomi | |||
| @ | n/a | accesso agli attributi: i valori JSON | |
| non hanno attributi | |||
| [] | [] | operatore pedice usato per | |
| iterare sulle collezioni di | |||
| elementi XML e per predicati | |||
| [,] | operatore unione (risulta in una | ||
| combinazione di insiemi di nodi); chiamato | |||
| list operator in JSONPath, consente | |||
| di combinare nomi di membro, indici | |||
| di array, e fette | |||
| n/a | [start:end:step] | operatore di fetta di array preso | |
| da ES4 | |||
| [] | ? | applica un'espressione di filtro | |
| (script) | |||
| seamless | n/a | motore di espressioni | |
| () | n/a | raggruppamento |
Tabella 20: Sintassi XPath confrontata con JSONPath
Per ulteriore illustrazione, la Tabella 21 mostra alcune espressioni XPath e i loro equivalenti JSONPath.
| XPath | JSONPath | Risultato |
|---|---|---|
| /store/book/author | $.store.book[*].author | gli autori |
| di tutti i libri | ||
| nel negozio | ||
| //author | $..author | tutti gli autori |
| /store/* | $.store.* | tutto ciò che è nel |
| negozio, vale a dire | ||
| alcuni libri e una | ||
| bicicletta rossa | ||
| /store//price | $.store..price | i prezzi di |
| tutto ciò che è nel | ||
| negozio | ||
| //book[3] | $..book[2] | il terzo |
| libro | ||
| //book[last()] | $..book[-1] | l'ultimo libro |
| in ordine | ||
| //book[position()<3] | $..book[0,1] | i primi due |
| $..book[:2] | libri | |
| //book[isbn] | $..book[[email protected]] | filtra tutti |
| i libri con un | ||
| numero ISBN | ||
| //book[price<10] | $..book[[email protected]<10] | filtra tutti |
| i libri più economici | ||
| di 10 | ||
| //* | $..* | tutti gli elementi |
| in un documento | ||
| XML; tutti i valori | ||
| di membro e gli elementi | ||
| di array | ||
| contenuti nel | ||
| valore di input |
Tabella 21: Esempi di espressioni XPath e equivalenti JSONPath
XPath ha molta più funzionalità (percorsi di posizione in sintassi non abbreviata, operatori, e funzioni) di quanto elencato in questo confronto. Inoltre, ci sono differenze significative nel modo in cui l'operatore pedice funziona in XPath e JSONPath:
- Le parentesi quadre nelle espressioni XPath operano sempre sul _node
set_ risultante dal frammento di percorso precedente. Gli indici iniziano sempre da 1.
- Con JSONPath, le parentesi quadre operano su ciascuno dei nodi nella
nodelist risultante dal segmento di interrogazione precedente. Gli indici di array iniziano sempre da 0.