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.