Når du bruger SQLite, kan vi bruge følgende metoder til at udtrække data fra et JSON-dokument.
json_extract()
Funktion
Som navnet antyder, er json_extract()
funktion udtrækker og returnerer en eller flere værdier fra veludformet JSON.
Eksempel:
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]}
Arrays er nul-baserede, og derfor starter optællingen ved 0
. Derfor specificerede vi [1]
for at få det andet element i hunde
array, som tilfældigvis er et JSON-objekt.
Vi kan kun returnere navnet på hunden på den position i arrayet ved at tilføje til vores sti:
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 bruge json_extract()
for at returnere flere stier:
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 udtrækker værdier fra flere stier, returneres værdierne i en matrix.
-> Operatør
Derfor kan vi ændre det første eksempel til dette:
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:
-> operatør returnerer altid en JSON-repræsentation af underkomponenten.json_extract()
funktion returnerer kun JSON, hvis der er to eller flere sti-argumenter (fordi resultatet så er et JSON-array), eller hvis enkeltsti-argumentet refererer til en matrix eller et objekt.- Hvis der kun er ét sti-argument, og den sti refererer til en JSON-nul eller en streng eller en numerisk værdi, så
json_extract()
returnerer den tilsvarende SQL NULL-, TEXT-, INTEGER- eller REAL-værdi.
Derfor er her, hvad der sker, når vi uddrager en hunds navn fra vores 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"
Denne gang er det omgivet af citater. Det er fordi det returnerede en JSON-repræsentation af værdien. Da vi udtrak den samme værdi med json_extract()
tidligere fik vi en SQL-repræsentation af værdien.
Vi kan dog også bruge
->> Operatør
->
operator, bortset fra at ->> returnerer en SQL-repræsentation af den angivne underkomponent. Specifikt returnerer den en
SQL TEKST
, INTEGER
, RIGTIG
eller NULL
værdi, der repræsenterer den valgte underkomponent, eller NULL
hvis underkomponenten ikke eksisterer.
Derfor er her, hvad der sker, når vi bruger ->>
operatør for at udtrække hundens navn:
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 er ikke længere omgivet af anførselstegn.