SQLite json_replace()
Funkce nám umožňuje nahradit existující hodnotu v dokumentu JSON jinou hodnotou.
Původní JSON předáme jako první argument při volání funkce, za ním následuje cesta hodnoty, která má být nahrazena, následovaná hodnotou, která má být nahrazena.
V případě potřeby můžeme také nahradit několik párů klíč/hodnota.
Syntaxe
Funguje to takto:
json_replace(json, path1, value1, path2, value2...)
Kde json
představuje původní JSON a path1, value1, path2, value2...
jsou páry cesta/hodnota, které je třeba nahradit.
Příklad
Zde je základní příklad k demonstraci:
SELECT json_replace('{ "name" : "Fluffy" }', '$.name', "Baldy");
Výsledek:
{"name":"Baldy"}
Zde jsem aktualizoval hodnotu name
klíč z Fluffy
na Baldy
.
Můžeme aktualizovat několik párů klíč/hodnota takto:
SELECT json_replace('{
"name" : "Fluffy",
"age" : 10
}',
'$.name', "Baldy",
'$.age', 11
);
Výsledek:
{"name":"Baldy","age":11}
Jednoduše jsem přidal více argumentů klíč/hodnota, když jsem zavolal json_replace()
.
Zde jsem použil zalomení řádků, aby se kód lépe četl. Mohlo to být všechno na jednom řádku – výsledek by byl stejný.
Co když klíč neexistuje?
Pokud klíč v JSON ještě neexistuje, nic se nenahradí:
SELECT json_replace('{ "name" : "Fluffy" }', '$.age', 11);
Výsledek:
{"name":"Fluffy"}
Toto je hlavní charakteristika, která odlišuje json_replace()
funkce z json_set()
a json_insert()
funkcí. Tyto funkce vloží hodnotu, pokud klíč ještě neexistuje.
Je však možné efektivně vkládat nové klíče pomocí json_replace()
nahrazením celého objektu/dokumentu JSON. Příklad níže.
Nahradit celý dokument JSON
Můžeme použít json_replace()
k nahrazení celého dokumentu JSON jiným:
SELECT json_replace('{ "name" : "Fluffy" }', '$', json('{ "name" : "Baldy" }') );
Výsledek:
{"name":"Baldy"}
To nám umožňuje efektivně vkládat nové klíče do dokumentu:
SELECT json_replace('{
"name" : "Fluffy"
}',
'$',
json('{
"name" : "Baldy" ,
"age" : 11
}'
)
);
Výsledek:
{"name":"Baldy","age":11}
Přísně vzato jsme nevložili žádné nové klíče. Jednoduše jsme nahradili celý dokument. Ale výsledkem byl dokument JSON, který obsahuje klíče, které původní neobsahoval.
Nahradit vložený objekt
Můžeme také nahradit vložené objekty:
SELECT json_replace('
{
"a" : 1,
"b" : { "c" : 1 }
}',
'$.b',
json('{ "c" : 2 }')
);
Výsledek:
{"a":1,"b":{"c":2}}
Když jsem to udělal, použil jsem json()
funkce vrátit můj argument jako řetězec JSON. Když to neudělám, stane se toto:
SELECT json_replace('
{
"a" : 1,
"b" : { "c" : 1 }
}',
'$.b',
'{ "c" : 2 }'
);
Výsledek:
{"a":1,"b":"{ \"c\" : 2 }"}
Dokument JSON je vložen jako textová hodnota namísto objektu JSON a jeho dvojité uvozovky jsou proto ukončeny zpětnými lomítky.
Jednoduché uvozovky však nemůžeme jednoduše odstranit, protože to vede k chybě:
SELECT json_replace('
{
"a" : 1,
"b" : { "c" : 1 }
}',
'$.b',
{ "c" : 2 }
);
Výsledek:
Parse error: unrecognized token: "{" "b" : { "c" : 1 } }', '$.b', { "c" : 2 } ); error here ---^
Bez jednoduchých uvozovek nebo json()
funkce, dostaneme chybu, jakmile narazí na levou složenou závorku. Musíme proto používat jednoduché uvozovky nebo json()
v závislosti na tom, zda vkládáme objekt JSON nebo hodnotu řetězce/textu SQL.
Dalším způsobem, jak vložit objekt JSON, je použít json_object()
místo funkce json()
funkce:
SELECT json_replace('
{
"a" : 1,
"b" : { "c" : 1 }
}',
'$.b',
json_object('c', 2)
);
Výsledek:
{"a":1,"b":{"c":2}}
Nahradit pole
Stejný koncept platí pro pole:
SELECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', json('[ 5, 6, 7 ]'));
Výsledek:
{"a":[5,6,7]}
Pokud odstraníme json()
funkce, dostaneme toto:
SELECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', '[ 5, 6, 7 ]');
Výsledek:
{"a":"[ 5, 6, 7 ]"}
A pokud odstraníme jednoduché uvozovky, dostaneme chybu:
SELECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', [ 5, 6, 7 ]);
Výsledek:
Parse error: no such column: 5, 6, 7 (17) LECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', [ 5, 6, 7 ]); error here ---^
Alternativně můžeme použít json_array()
funkce namísto json()
. Tato funkce vám umožňuje vytvořit pole na základě jeho argumentů:
SELECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', json_array(5, 6, 7));
Výsledek:
{"a":[5,6,7]}
Přidat hodnoty na konec pole
K připojení hodnot na konec pole můžeme použít buď json_insert()
nebo json_set()
funkcí.
Pokud však musíme použít json_replace()
, můžeme celé pole nahradit jiným, které má na konec pole přidanou hodnotu/y navíc:
SELECT json_replace('[ 1, 2, 3 ]', '$', json('[ 1, 2, 3, 4 ]') );
Výsledek:
[1,2,3,4]
Ale jak bylo zmíněno, json_insert()
a json_set()
vám umožní skutečně připojit hodnoty k poli bez nahrazení celého pole.
Nahradit prvky pole
Zde je příklad použití json_replace()
chcete-li nahradit prvek v poli:
SELECT json_replace('[ 1, 2, 3 ]', '$[1]', 4 );
Výsledek:
[1,4,3]
Pole jsou založeny na nule, a proto [1]
označuje druhou položku pole.
json_set()
funkci lze také použít k nahrazení stávajících prvků. Nicméně json_insert()
funkce nám neumožňuje nahradit existující prvky.
Neplatné cesty
Pokud naše cesta není správně vytvořena, zobrazí se chyba:
SELECT json_replace('{ "a" : 1 }', 'a', 2);
Výsledek:
Runtime error: JSON path error near 'a'
V tomto případě jsem zapomněl uvést $.
v přední části cesty.
Neplatné dokumenty JSON
Také se zobrazí chyba, že JSON není správně vytvořen:
SELECT json_replace('{ "a" : 1', '$.a', 2);
Výsledek:
Runtime error: malformed JSON
Tentokrát nám chyba říká, že náš JSON je chybný.