SQLite json_insert()
funkce nám umožňuje vložit novou hodnotu do 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 nová hodnota, následovaná hodnotou, která se má vložit.
V případě potřeby můžeme také vložit více párů klíč/hodnota.
Syntaxe
Funkce se nazývá takto:
json_extract(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.
Příklad
Zde je základní příklad k demonstraci:
SELECT json_insert('{ "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_insert('{ "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_insert()
.
Klíč/hodnota již existuje?
json_insert()
funkce nevloží hodnotu, pokud klíč již existuje:
SELECT json_insert('{ "a" : 1 }', '$.a', 2);
Výsledek:
{"a":1}
V tomto případě klíč a
již v JSON existuje, a tak pokus o vložení nové hodnoty pro tento klíč nefunguje.
Chcete-li nahradit hodnotu, použijte buď json_replace()
nebo json_set()
.
Vložit objekt
Zde je příklad vložení dalšího dokumentu JSON:
SELECT json_insert('{ "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_insert('{ "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.
Tohle je ale dost fér. Koneckonců jsme novou hodnotu uzavřeli do jednoduchých uvozovek. Jak měl SQLite vědět, zda chceme vložit řetězec nebo objekt JSON?
A není to tak, že bychom mohli jednoduše odstranit tyto jednoduché uvozovky:
SELECT json_insert('{ "a" : 1 }', '$.b', { "c" : 2 } );
Výsledek:
Parse error: unrecognized token: "{" SELECT json_insert('{ "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_insert('{ "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_insert('{ "a" : 1 }', '$.b', json('[ 2, 3, 4 ]'));
Výsledek:
{"a":1,"b":[2,3,4]}
Pokud odstraníme json()
funkce, dostaneme toto:
SELECT json_insert('{ "a" : 1 }', '$.b', '[ 2, 3, 4 ]');
Výsledek:
{"a":1,"b":"[ 2, 3, 4 ]"}
A pokud odstraníme jednoduché uvozovky, dostaneme chybu:
SELECT json_insert('{ "a" : 1 }', '$.b', [ 2, 3, 4 ]);
Výsledek:
Parse error: no such column: 2, 3, 4 SELECT json_insert('{ "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_insert('{ "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_insert()
pro připojení hodnot na konec pole.
Chcete-li to provést, použijte index pole [#]
:
SELECT json_insert('[ 1, 2, 3 ]', '$[#]', 4 );
Výsledek:
[1,2,3,4]
Stejný princip platí pro vnořená pole:
SELECT json_insert('[ 1, [ "a", "b" ], 3 ]', '$[1][#]', "c" );
Výsledek:
[1,["a","b","c"],3]
Neplatné cesty
Pokud naše cesta není správně vytvořena, zobrazí se chyba:
SELECT json_insert('{ "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_insert('{ "a" : 1', '$.b', 2);
Výsledek:
Runtime error: malformed JSON
Tentokrát nám chyba říká, že náš JSON je chybný.