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.