Můžeme použít SQLite json_remove()
funkce k odstranění jednoho nebo více prvků z objektu nebo pole JSON.
Původní JSON předáme jako první argument při volání funkce, za nímž následuje jedna nebo více cest, které určují, které prvky se mají odstranit. „Prvky“ mám na mysli buď prvky pole nebo členy objektu (páry klíč/hodnota).
Syntaxe
Syntaxe vypadá takto:
json_remove(X,P,...)
Kde X
představuje původní JSON a P,...
představuje cestu/y k odstranění.
Příklad
Zde je příklad k demonstraci:
SELECT json_remove('{ "name" : "Fluffy", "age" : 10 }', '$.age');
Výsledek:
{"name":"Fluffy"}
Zde jsme zadali $.age
cestu, a to bylo z dokumentu JSON odstraněno.
Odebrat více členů
Z objektu JSON můžeme odebrat více členů zadáním více cest oddělených čárkou:
SELECT json_remove('{
"name" : "Fluffy",
"type" : "Cat",
"age" : 10
}',
'$.type',
'$.age'
);
Výsledek:
{"name":"Fluffy"}
Pole
Prvky pole můžeme odstranit zadáním indexu prvku:
SELECT json_remove('[ 0, 1, 2, 3 ]', '$[2]');
Výsledek:
[0,1,3]
Pole jsou založeny na nule, takže počítání začíná od 0
.
Je však důležité dbát na pořadí, ve kterém se odstranění provádí. K odstranění dochází postupně zleva doprava. Změny způsobené předchozím odstraněním mohou ovlivnit hledání cesty pro následující argumenty.
Zde je příklad toho, jak to může ovlivnit náš výsledek:
SELECT json_remove('[ 0, 1, 2, 3 ]',
'$[0]',
'$[2]'
);
Výsledek:
[1,2]
V tomto případě prvek pole 0
byl nejprve odstraněn, poté prvek pole 2
byl odstraněn ze zbývajícího pole. Jinými slovy, druhá cesta odstranila prvek z pole poté, co již byla odstraněna první cesta.
Výsledné pole je takové, které jsme možná nepředpokládali. Místo odstranění prvků 0
a 2
z původního pole jsme odstranili prvky 0
a 3
z původního pole.
Tento problém můžeme překonat změnou pořadí cest:
SELECT json_remove('[ 0, 1, 2, 3 ]',
'$[2]',
'$[0]'
);
Výsledek:
[1,3]
Žádné cesty
Argumenty cesty jsou ve skutečnosti volitelné. Pokud zavoláme json_remove()
bez argumentů cesty vrací zmenšenou verzi vstupního JSON (tj. s odstraněnými přebytečnými mezerami):
SELECT json_remove('{
"name" : "Fluffy",
"type" : "Cat",
"age" : 10
}'
);
Výsledek:
{"name":"Fluffy","type":"Cat","age":10}
To je stejný výsledek, jaký bychom dostali, kdybychom použili json()
funkce namísto json_remove()
.
Neexistující cesta
Zadáním cesty, která ve vstupním JSON neexistuje, bude vrácen původní JSON beze změny:
SELECT json_remove('{ "name" : "Fluffy", "age" : 10 }', '$.type');
Výsledek:
{"name":"Fluffy","age":10}
Neplatné cesty
Pokud naše cesta není správně vytvořena, zobrazí se chyba:
SELECT json_remove('{ "name" : "Fluffy", "age" : 10 }', 'age');
Výsledek:
Runtime error: JSON path error near 'age'
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_remove('{ "name" : "Fluffy", "age" }', '$.age');
Výsledek:
Runtime error: malformed JSON
Tentokrát nám chyba říká, že náš JSON je chybný.