Wanneer we SQLite gebruiken, kunnen we de volgende methoden gebruiken om gegevens uit een JSON-document te extraheren.
De json_extract()
Functie
Zoals de naam al doet vermoeden, is de json_extract()
functie extraheert en retourneert een of meer waarden uit goed gevormde JSON.
Voorbeeld:
SELECT json_extract('{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}',
'$.dogs[1]'
);
Resultaat:
{"name":"Bark","scores":[3,4,8,7]}
Arrays zijn gebaseerd op nul, en dus begint de telling bij 0
. Daarom hebben we [1]
. gespecificeerd om het tweede element binnen de dogs
te krijgen array, wat toevallig een JSON-object is.
We kunnen alleen de naam van de hond op die positie in de array retourneren door aan ons pad toe te voegen:
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'
);
Resultaat:
Bark
We kunnen json_extract()
. gebruiken om meerdere paden terug te geven:
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'
);
Resultaat:
["Wag","Bark","Woof"]
Wanneer we waarden uit meerdere paden extraheren, worden de waarden geretourneerd in een array.
De ->
Operator
De ->
operator extraheert een subcomponent uit een JSON-document en retourneert een JSON-representatie van die subcomponent.
Daarom kunnen we het eerste voorbeeld hierin veranderen:
SELECT '{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}' -> '$.dogs[1]';
Resultaat:
{"name":"Bark","scores":[3,4,8,7]}
De ->
operator is subtiel anders dan de json_extract()
functie:
- De
->
operator retourneert altijd een JSON-representatie van het subonderdeel. - De
json_extract()
functie retourneert alleen JSON als er twee of meer padargumenten zijn (omdat het resultaat dan een JSON-array is) of als het enkele padargument verwijst naar een array of object. - Als er maar één padargument is en dat pad verwijst naar een JSON-null of een tekenreeks of een numerieke waarde, dan
json_extract()
geeft de corresponderende SQL NULL, TEXT, INTEGER of REAL waarde terug.
Daarom is dit wat er gebeurt als we de naam van een hond uit onze JSON halen:
SELECT '{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}' -> '$.dogs[1].name';
Resultaat:
"Bark"
Deze keer is het omgeven door aanhalingstekens. Dat komt omdat het een JSON-representatie van de waarde heeft geretourneerd. Toen we dezelfde waarde extraheren met json_extract()
eerder kregen we een SQL-representatie van de waarde.
We kunnen echter ook de ->>
. gebruiken operator om een SQL-representatie te retourneren.
De ->>
Operator
De ->>
operator werkt op dezelfde manier als de ->
operator, behalve dat ->>
retourneert een SQL-representatie van de opgegeven subcomponent. In het bijzonder retourneert het een SQL TEXT
, INTEGER
, REAL
, of NULL
waarde die de geselecteerde subcomponent vertegenwoordigt, of NULL
als de subcomponent niet bestaat.
Daarom is dit wat er gebeurt als we de ->>
. gebruiken operator om de naam van de hond te extraheren:
SELECT '{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}' ->> '$.dogs[1].name';
Resultaat:
Bark
Het staat niet langer tussen aanhalingstekens.