Passa al contenuto principale

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.

XPathJSONPathDescrizione
/$l'elemento XML radice
.@l'elemento XML corrente
/. o []operatore figlio
..n/aoperatore genitore
//..name,discendenti (JSONPath prende
..[index], ..*,questa sintassi da E4X)
o ..[*]
**jolly: tutti gli elementi XML
indipendentemente dai nomi
@n/aaccesso 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)
seamlessn/amotore di espressioni
()n/araggruppamento

Tabella 20: Sintassi XPath confrontata con JSONPath

Per ulteriore illustrazione, la Tabella 21 mostra alcune espressioni XPath e i loro equivalenti JSONPath.

XPathJSONPathRisultato
/store/book/author$.store.book[*].authorgli autori
di tutti i libri
nel negozio
//author$..authortutti gli autori
/store/*$.store.*tutto ciò che è nel
negozio, vale a dire
alcuni libri e una
bicicletta rossa
/store//price$.store..pricei 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.