Při použití SQLite můžeme k extrakci dat z JSON dokumentu použít následující metody.
json_extract()
Funkce
Jak jeho název napovídá, json_extract()
funkce extrahuje a vrátí jednu nebo více hodnot ze správně vytvořeného JSON.
Příklad:
SELECT json_extract('{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}',
'$.dogs[1]'
);
Výsledek:
{"name":"Bark","scores":[3,4,8,7]}
Pole jsou založeny na nule, takže počet začíná na 0
. Proto jsme zadali [1]
získat druhý prvek v rámci dogs
pole, což je shodou okolností objekt JSON.
Můžeme vrátit pouze jméno psa na této pozici v poli přidáním do naší cesty:
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'
);
Výsledek:
Bark
Můžeme použít json_extract()
pro vrácení více cest:
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'
);
Výsledek:
["Wag","Bark","Woof"]
Když extrahujeme hodnoty z více cest, hodnoty jsou vráceny v poli.
Kód ->
Operátor
->
operátor extrahuje dílčí komponentu z dokumentu JSON a vrací reprezentaci JSON této dílčí komponenty.
Proto můžeme změnit první příklad na tento:
SELECT '{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}' -> '$.dogs[1]';
Výsledek:
{"name":"Bark","scores":[3,4,8,7]}
->
operátor se mírně liší od json_extract()
funkce:
->
operátor vždy vrací reprezentaci JSON podsoučásti.json_extract()
funkce vrací JSON pouze v případě, že existují dva nebo více argumentů cesty (protože výsledkem je pak pole JSON) nebo pokud jediný argument cesty odkazuje na pole nebo objekt.- Pokud existuje pouze jeden argument cesty a tato cesta odkazuje na hodnotu JSON null nebo řetězec nebo číselnou hodnotu, pak
json_extract()
vrátí odpovídající hodnotu SQL NULL, TEXT, INTEGER nebo REAL.
Zde je tedy to, co se stane, když z našeho JSON vyjmeme jméno psa:
SELECT '{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}' -> '$.dogs[1].name';
Výsledek:
"Bark"
Tentokrát je obklopen uvozovkami. Je to proto, že vrátil reprezentaci hodnoty JSON. Když jsme extrahovali stejnou hodnotu pomocí json_extract()
dříve jsme získali SQL reprezentaci hodnoty.
Můžeme však také použít ->>
operátor vrátit reprezentaci SQL.
->>
Operátor
->>
Operátor funguje stejně jako ->
operátor, kromě ->>
vrátí SQL reprezentaci zadané dílčí komponenty. Konkrétně vrací SQL TEXT
, INTEGER
, REAL
, nebo NULL
hodnota, která představuje vybranou dílčí komponentu, nebo NULL
pokud dílčí komponenta neexistuje.
Zde je proto, co se stane, když použijeme ->>
operátor k vyjmutí jména psa:
SELECT '{
"dogs" : [
{ "name" : "Wag", "scores" : [ 7, 9 ] },
{ "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
{ "name" : "Woof", "scores" : [ 3, 2, 1 ] }
]
}' ->> '$.dogs[1].name';
Výsledek:
Bark
Již není uzavřeno v uvozovkách.