När vi använder SQLite kan vi använda följande metoder för att extrahera data från ett JSON-dokument.
json_extract()
Funktion
Som namnet antyder, json_extract()
funktion extraherar och returnerar ett eller flera värden från välformad JSON.
Exempel:
SELECT json_extract('{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}',
'$.dogs[1]'
);
Resultat:
{"name":"Bark","scores":[3,4,8,7]}
Matriser är nollbaserade, så räkningen börjar vid 0
. Därför angav vi [1]
för att få det andra elementet inom hundar
array, som råkar vara ett JSON-objekt.
Vi kan bara returnera namnet på hunden på den positionen i arrayen genom att lägga till i vår sökväg:
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'
);
Resultat:
Bark
Vi kan använda json_extract()
för att returnera flera sökvägar:
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'
);
Resultat:
["Wag","Bark","Woof"]
När vi extraherar värden från flera sökvägar, returneras värdena i en array.
-> Operatör
Därför kan vi ändra det första exemplet till detta:
SELECT '{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}' -> '$.dogs[1]';
Resultat:
{"name":"Bark","scores":[3,4,8,7]}
json_extract()
funktion:
-
-> operatorn returnerar alltid en JSON-representation av underkomponenten. json_extract()
Funktionen returnerar endast JSON om det finns två eller flera sökvägsargument (eftersom resultatet då är en JSON-matris) eller om det enkla sökvägsargumentet refererar till en matris eller ett objekt.- Om det bara finns ett sökvägsargument och den sökvägen refererar till en JSON-null eller en sträng eller ett numeriskt värde, då
json_extract()
returnerar motsvarande SQL NULL-, TEXT-, INTEGER- eller REAL-värde.
Därför är det här vad som händer när vi extraherar en hunds namn från vår JSON:
SELECT '{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}' -> '$.dogs[1].name';
Resultat:
"Bark"
Den här gången är den omgiven av citat. Det beror på att det returnerade en JSON-representation av värdet. När vi extraherade samma värde med json_extract()
tidigare fick vi en SQL-representation av värdet.
Men vi kan också använda
->> Operatör
->
operator, förutom att ->> returnerar en SQL-representation av den angivna underkomponenten. Specifikt returnerar den en
SQL-TEXT
, INTEGER
, REAL
, eller NULL
värde som representerar den valda underkomponenten, eller NULL
om underkomponenten inte finns.
Därför är det här vad som händer när vi använder ->>
operatör för att extrahera hundens namn:
SELECT '{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}' ->> '$.dogs[1].name';
Resultat:
Bark
Det står inte längre inom citattecken.