V SQLite, json_patch()
funkci lze použít k přidání, úpravě nebo odstranění prvků objektu JSON.
Za tímto účelem spustí algoritmus RFC-7396 MergePatch, který aplikuje danou opravu na daný vstup JSON.
Původní JSON předáme jako první argument při volání funkce, následovaný patchem. Funkce pak aplikuje tuto opravu na JSON v prvním argumentu.
Syntaxe
Syntaxe vypadá takto:
json_patch(T,P)
Kde T
představuje původní JSON a P
je náplast. Funkce aplikuje patch P
proti T
.
Obsah poskytnutého patche P
se porovnává s aktuálním obsahem cílového dokumentu JSON T
. Pokud P
obsahuje členy, které se nevyskytují v T
, tito členové jsou přidáni. Pokud T
obsahuje člen, hodnota je nahrazena.
Hodnoty Null v P
mají zvláštní význam pro označení odstranění existujících hodnot v T
.
Příklady
Zde je několik příkladů k demonstraci.
Vložit
SELECT json_patch('{ "name" : "Fluffy" }', '{ "age" : 10 }');
Výsledek:
{"name":"Fluffy","age":10}
Pokus o vložení nového člena s hodnotou null nefunguje:
SELECT json_patch('{ "name" : "Fluffy" }', '{ "age" : null }');
Výsledek:
{"name":"Fluffy"}
Hodnoty Null se ve skutečnosti používají k odstranění členů z JSON (jak je vidět v pozdějším příkladu).
Aktualizovat
SELECT json_patch('{ "name" : "Fluffy" }', '{ "name" : "Baldy" }');
Výsledek:
{"name":"Baldy"}
Pokud existuje více párů klíč/hodnota, ale my chceme aktualizovat pouze jeden, potřebujeme v našem druhém argumentu specifikovat pouze jeden:
SELECT json_patch('{ "name" : "Fluffy", "age" : 10 }', '{ "name" : "Baldy" }');
Výsledek:
{"name":"Baldy","age":10}
Stejný koncept platí při aktualizaci více párů klíč/hodnota – potřebujeme pouze specifikovat tyto:
SELECT json_patch('{
"name" : "Fluffy",
"type" : "Cat",
"age" : 10
}',
'{
"name" : "Baldy",
"age" : 11
}'
);
Výsledek:
{"name":"Baldy","type":"Cat","age":11}
Aktualizovat a vložit
SELECT json_patch('{ "name" : "Fluffy" }', '{ "name" : "Baldy", "age" : 10 }');
Výsledek:
{"name":"Baldy","age":10}
Smazat/Odebrat
Hodnoty Null v patchi sloučení mají zvláštní význam, který označuje odstranění existujících hodnot v cíli:
SELECT json_patch('{ "name" : "Fluffy", "age" : 10 }', '{ "age" : null }');
Výsledek:
{"name":"Fluffy"}
Pole
json_patch()
Funkce nemůže připojovat prvky k poli ani upravovat jednotlivé prvky pole. Může pouze vložit, nahradit nebo odstranit celé pole jako jednu jednotku.
Zde je příklad připojení prvku k poli:
SELECT json_patch('[ 1, 2, 3 ]', '[ 1, 2, 3, 4 ]');
Výsledek:
[1,2,3,4]
Musel jsem vyměnit původní pole za zcela nové. Technicky jsem tedy ve skutečnosti nic nepřipojil – jednoduše jsem nahradil celé pole jiným.
Stejný koncept platí, pokud je pole v objektu:
SELECT json_patch('{ "scores" : [ 1, 2, 3 ] }', '{ "scores" : [ 1, 2, 3, 4 ] }');
Výsledek:
{"scores":[1,2,3,4]}
Pokud potřebujete pracovat s poli, vyzkoušejte funkce jako json_set()
, json_insert()
, json_remove()
a json_replace()
místo toho.
Nahradit objekt polem
Objekty můžeme nahradit polem jednoduše tím, že pole dodáme jako záplatu:
SELECT json_patch('{ "name" : "Fluffy", "age" : 10 }', '[ "Fluffy", 10 ]');
Výsledek:
["Fluffy",10]
Nahradit pole objektem
A funguje to i obráceně:
SELECT json_patch('[ "Fluffy", 10 ]', '{ "name" : "Fluffy", "age" : 10 }');
Výsledek:
{"name":"Fluffy","age":10}