Podemos usar o SQLite
json_remove()
função para remover um ou mais elementos de um objeto ou matriz JSON. Passamos o JSON original como o primeiro argumento quando chamamos a função, seguido por um ou mais caminhos que especificam quais elementos remover. Por “elementos”, quero dizer elementos de matriz ou membros de objetos (pares chave/valor).
Sintaxe
A sintaxe fica assim:
json_remove(X,P,...)
Onde
X
representa o JSON original e P,...
representa o(s) caminho(s) a serem excluídos. Exemplo
Segue um exemplo para demonstrar:
SELECT json_remove('{ "name" : "Fluffy", "age" : 10 }', '$.age');
Resultado:
{"name":"Fluffy"}
Aqui, especificamos o
$.age
path, e foi isso que foi removido do documento JSON. Remover vários membros
Podemos remover vários membros de um objeto JSON especificando vários caminhos, separados por uma vírgula:
SELECT json_remove('{
"name" : "Fluffy",
"type" : "Cat",
"age" : 10
}',
'$.type',
'$.age'
);
Resultado:
{"name":"Fluffy"}
Matrizes
Podemos remover elementos do array especificando o índice do elemento:
SELECT json_remove('[ 0, 1, 2, 3 ]', '$[2]');
Resultado:
[0,1,3]
As matrizes são baseadas em zero e, portanto, a contagem começa em
0
. No entanto, é importante estar atento à ordem em que as remoções são feitas. As remoções ocorrem sequencialmente da esquerda para a direita. As alterações causadas por remoções anteriores podem afetar a pesquisa de caminho para argumentos subsequentes.
Aqui está um exemplo de como isso pode afetar nosso resultado:
SELECT json_remove('[ 0, 1, 2, 3 ]',
'$[0]',
'$[2]'
);
Resultado:
[1,2]
Neste caso, o elemento de array
0
foi deletado primeiro, depois o elemento array 2
foi excluído da matriz restante. Em outras palavras, o segundo caminho removeu o elemento do array após o primeiro caminho já ter sido removido. A matriz resultante é uma que talvez não tenhamos previsto. Em vez de remover os elementos
0
e 2
do array original, removemos os elementos 0
e 3
da matriz original. Podemos superar esse problema reordenando os caminhos:
SELECT json_remove('[ 0, 1, 2, 3 ]',
'$[2]',
'$[0]'
);
Resultado:
[1,3]
Sem caminhos
Os argumentos de caminho são realmente opcionais. Se chamarmos
json_remove()
sem argumentos de caminho, ele retorna uma versão reduzida do JSON de entrada (ou seja, com o excesso de espaço em branco removido):SELECT json_remove('{
"name" : "Fluffy",
"type" : "Cat",
"age" : 10
}'
);
Resultado:
{"name":"Fluffy","type":"Cat","age":10}
Este é o mesmo resultado que obteríamos se usássemos o
json()
função em vez de json_remove()
. Caminho inexistente
Especificar um caminho que não existe no JSON de entrada resulta no retorno do JSON original, inalterado:
SELECT json_remove('{ "name" : "Fluffy", "age" : 10 }', '$.type');
Resultado:
{"name":"Fluffy","age":10}
Caminhos inválidos
Receberemos um erro se nosso caminho não estiver bem formado:
SELECT json_remove('{ "name" : "Fluffy", "age" : 10 }', 'age');
Resultado:
Runtime error: JSON path error near 'age'
Nesse caso, esqueci de incluir
$.
na frente do caminho. Documentos JSON inválidos
Também receberemos um erro de que o JSON não está bem formado:
SELECT json_remove('{ "name" : "Fluffy", "age" }', '$.age');
Resultado:
Runtime error: malformed JSON
Desta vez, o erro nos diz que nosso JSON está malformado.