SQLite json_set()
Funkce nám umožňuje vložit nebo nahradit hodnotu v dokumentu JSON.
Původní JSON předáme jako první argument při volání funkce, za ním následuje cesta, která určuje, kam se má vložit/nahradit nová hodnota, následovaná hodnotou, která se má vložit/nahradit.
V případě potřeby můžeme také vložit/nahradit více párů klíč/hodnota.
Syntaxe
Funguje to takto:
json_set(json, path1, value1, path2, value2...)
Kde json
představuje původní JSON a path1, value1, path2, value2...
jsou páry cesta/hodnota, které můžeme použít k vložení nových hodnot do dokumentu JSON (nebo k nahrazení, podle okolností).
Příklad
Zde je základní příklad k demonstraci:
SELECT json_set('{ "a" : 1 }', '$.b', 2);
Výsledek:
{"a":1,"b":2}
Zde jsem vložil nový pár klíč/hodnota ("b":2
) do dokumentu JSON.
Můžeme vložit více párů klíč/hodnota takto:
SELECT json_set('{ "a" : 1 }', '$.b', 2, '$.c', 3 );
Výsledek:
{"a":1,"b":2,"c":3}
Jednoduše jsem přidal více argumentů klíč/hodnota, když jsem zavolal json_set()
.
Nahradit hodnoty
Pokud klíč již existuje, jeho hodnota se nahradí novou hodnotou:
SELECT json_set('{ "a" : 1, "b" : 2 }', '$.b', 3);
Výsledek:
{"a":1,"b":3}
Toto je hlavní rozdíl mezi json_set()
a json_insert()
. json_insert()
funkce nevloží hodnotu, pokud klíč již existuje.
Dalším způsobem, jak nahradit hodnoty, je použít json_replace()
.
Vložit objekt
Zde je příklad vložení objektu JSON:
SELECT json_set('{ "a" : 1 }', '$.b', json('{ "c" : 2 }') );
Výsledek:
{"a":1,"b":{"c":2}}
V tomto případě jsem použil json()
funkce vrátit můj argument jako řetězec JSON. Když to neudělám, stane se toto:
SELECT json_set('{ "a" : 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.
Pouhé odstranění jednoduchých uvozovek však způsobí chybu:
SELECT json_set('{ "a" : 1 }', '$.b', { "c" : 2 } );
Výsledek:
Parse error: unrecognized token: "{" SELECT json_set('{ "a" : 1 }', '$.b', { "c" : 2 } ); error here ---^
Bez jednoduchých uvozovek nebo json()
funkce, dostaneme chybu, jakmile narazí na levou složenou závorku.
Dalším způsobem, jak vložit objekt JSON, je použít json_object()
místo funkce json()
funkce:
SELECT json_set('{ "a" : 1 }', '$.b', json_object('c', 2) );
Výsledek:
{"a":1,"b":{"c":2}}
Vložit pole
Při vkládání polí je to podobné:
SELECT json_set('{ "a" : 1 }', '$.b', json('[ 2, 3, 4 ]'));
Výsledek:
{"a":1,"b":[2,3,4]}
Pokud odstraníme json()
funkce, dostaneme toto:
SELECT json_set('{ "a" : 1 }', '$.b', '[ 2, 3, 4 ]');
Výsledek:
{"a":1,"b":"[ 2, 3, 4 ]"}
A pokud odstraníme jednoduché uvozovky, dostaneme chybu:
SELECT json_set('{ "a" : 1 }', '$.b', [ 2, 3, 4 ]);
Výsledek:
Parse error: no such column: 2, 3, 4 SELECT json_set('{ "a" : 1 }', '$.b', [ 2, 3, 4 ]); 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_set('{ "a" : 1 }', '$.b', json_array( 2, 3, 4 ) );
Výsledek:
{"a":1,"b":[2,3,4]}
Přidat hodnoty na konec pole
Můžeme použít json_set()
pro připojení hodnot na konec pole.
Chcete-li to provést, použijte index pole [#]
:
SELECT json_set('[ 1, 2, 3 ]', '$[#]', 4 );
Výsledek:
[1,2,3,4]
Stejný princip platí pro vnořená pole:
SELECT json_set('[ 1, [ "a", "b" ], 3 ]', '$[1][#]', "c" );
Výsledek:
[1,["a","b","c"],3]
Nahradit prvky pole
Můžeme použít json_set()
k nahrazení prvků v poli:
SELECT json_set('[ 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_replace()
funkci lze také použít k nahrazení stávajících prvků. Opět se to liší od json_insert()
, který nenahrazuje stávající prvky.
Neplatné cesty
Pokud naše cesta není správně vytvořena, zobrazí se chyba:
SELECT json_set('{ "a" : 1 }', 'b', 2);
Výsledek:
Runtime error: JSON path error near 'b'
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_set('{ "a" : 1', '$.b', 2);
Výsledek:
Runtime error: malformed JSON
Tentokrát nám chyba říká, že náš JSON je chybný.