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.