Quando si utilizza SQLite, è possibile utilizzare i seguenti metodi per estrarre i dati da un documento JSON.
Il json_extract()
Funzione
Come suggerisce il nome, json_extract()
la funzione estrae e restituisce uno o più valori da JSON ben formato.
Esempio:
SELECT json_extract('{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}',
'$.dogs[1]'
);
Risultato:
{"name":"Bark","scores":[3,4,8,7]}
Gli array sono a base zero, quindi il conteggio inizia da 0
. Pertanto, abbiamo specificato [1]
per ottenere il secondo elemento all'interno di dogs
array, che risulta essere un oggetto JSON.
Possiamo restituire solo il nome del cane in quella posizione nell'array aggiungendo al nostro percorso:
SELECT json_extract('{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}',
'$.dogs[1].name'
);
Risultato:
Bark
Possiamo usare json_extract()
per restituire più percorsi:
SELECT json_extract('{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}',
'$.dogs[0].name',
'$.dogs[1].name',
'$.dogs[2].name'
);
Risultato:
["Wag","Bark","Woof"]
Quando estraiamo valori da più percorsi, i valori vengono restituiti in una matrice.
Il ->
Operatore
Il ->
estrae un sottocomponente da un documento JSON e restituisce una rappresentazione JSON di quel sottocomponente.
Pertanto, possiamo cambiare il primo esempio in questo:
SELECT '{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}' -> '$.dogs[1]';
Risultato:
{"name":"Bark","scores":[3,4,8,7]}
Il ->
l'operatore è leggermente diverso da json_extract()
funzione:
- Il
->
l'operatore restituisce sempre una rappresentazione JSON del sottocomponente. - Il
json_extract()
La funzione restituisce JSON solo se sono presenti due o più argomenti di percorso (perché il risultato è quindi una matrice JSON) o se l'argomento di percorso singolo fa riferimento a una matrice o a un oggetto. - Se c'è un solo argomento di percorso e quel percorso fa riferimento a un valore JSON null o una stringa o un valore numerico, allora
json_extract()
restituisce il valore SQL NULL, TEXT, INTEGER o REAL corrispondente.
Pertanto, ecco cosa succede quando estraiamo il nome di un cane dal nostro JSON:
SELECT '{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}' -> '$.dogs[1].name';
Risultato:
"Bark"
Questa volta è circondato da virgolette. Questo perché ha restituito una rappresentazione JSON del valore. Quando abbiamo estratto lo stesso valore con json_extract()
in precedenza, abbiamo ottenuto una rappresentazione SQL del valore.
Tuttavia, possiamo anche utilizzare il ->>
operatore per restituire una rappresentazione SQL.
Il ->>
Operatore
Il ->>
l'operatore funziona allo stesso modo di ->
operatore, tranne che ->>
restituisce una rappresentazione SQL del sottocomponente specificato. In particolare, restituisce un SQL TEXT
, INTEGER
, REAL
o NULL
valore che rappresenta il sottocomponente selezionato o NULL
se il sottocomponente non esiste.
Pertanto, ecco cosa succede quando utilizziamo il ->>
operatore per estrarre il nome del cane:
SELECT '{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}' ->> '$.dogs[1].name';
Risultato:
Bark
Non è più racchiuso tra virgolette.