No SQLite, o
json_patch()
A função pode ser usada para adicionar, modificar ou excluir elementos de um objeto JSON. Para fazer isso, ele executa o algoritmo MergePatch RFC-7396 para aplicar um determinado patch à entrada JSON fornecida.
Passamos o JSON original como o primeiro argumento quando chamamos a função, seguido do patch. A função então aplica esse patch ao JSON no primeiro argumento.
Sintaxe
A sintaxe fica assim:
json_patch(T,P)
Onde
T
representa o JSON original e P
é o remendo. A função aplica o patch P
contra T
. O conteúdo do patch fornecido
P
é comparado com o conteúdo atual do documento JSON de destino T
. Se P
contém membros que não aparecem em T
, esses membros são adicionados. Se T
contém o membro, o valor é substituído. Valores nulos em
P
recebem um significado especial para indicar a remoção de valores existentes em T
. Exemplos
Aqui estão alguns exemplos para demonstrar.
Inserir
SELECT json_patch('{ "name" : "Fluffy" }', '{ "age" : 10 }');
Resultado:
{"name":"Fluffy","age":10}
Tentar inserir um novo membro com um valor nulo não funciona:
SELECT json_patch('{ "name" : "Fluffy" }', '{ "age" : null }');
Resultado:
{"name":"Fluffy"}
Valores nulos são realmente usados para remover membros do JSON (como visto em um exemplo posterior).
Atualizar
SELECT json_patch('{ "name" : "Fluffy" }', '{ "name" : "Baldy" }');
Resultado:
{"name":"Baldy"}
Se houver vários pares de chave/valor, mas queremos atualizar apenas um, precisamos apenas especificar esse em nosso segundo argumento:
SELECT json_patch('{ "name" : "Fluffy", "age" : 10 }', '{ "name" : "Baldy" }');
Resultado:
{"name":"Baldy","age":10}
O mesmo conceito se aplica ao atualizar vários pares de chave/valor – precisamos apenas especificar esses:
SELECT json_patch('{
"name" : "Fluffy",
"type" : "Cat",
"age" : 10
}',
'{
"name" : "Baldy",
"age" : 11
}'
);
Resultado:
{"name":"Baldy","type":"Cat","age":11}
Atualizar e inserir
SELECT json_patch('{ "name" : "Fluffy" }', '{ "name" : "Baldy", "age" : 10 }');
Resultado:
{"name":"Baldy","age":10}
Excluir/Remover
Valores nulos no patch de mesclagem recebem um significado especial para indicar a remoção de valores existentes no destino:
SELECT json_patch('{ "name" : "Fluffy", "age" : 10 }', '{ "age" : null }');
Resultado:
{"name":"Fluffy"}
Matrizes
O
json_patch()
função não pode anexar elementos a uma matriz, nem modificar elementos individuais de uma matriz. Ele só pode inserir, substituir ou excluir toda a matriz como uma única unidade. Então, aqui está um exemplo de anexar um elemento a um array:
SELECT json_patch('[ 1, 2, 3 ]', '[ 1, 2, 3, 4 ]');
Resultado:
[1,2,3,4]
Eu tive que substituir a matriz original por uma totalmente nova. Então, tecnicamente, eu não acrescentei nada – simplesmente substituí todo o array por outro.
O mesmo conceito se aplica se a matriz estiver dentro de um objeto:
SELECT json_patch('{ "scores" : [ 1, 2, 3 ] }', '{ "scores" : [ 1, 2, 3, 4 ] }');
Resultado:
{"scores":[1,2,3,4]}
Se você precisa trabalhar com arrays, tente funções como
json_set()
, json_insert()
, json_remove()
e json_replace()
em vez de. Substituir um objeto por um array
Podemos substituir objetos por um array simplesmente fornecendo um array como patch:
SELECT json_patch('{ "name" : "Fluffy", "age" : 10 }', '[ "Fluffy", 10 ]');
Resultado:
["Fluffy",10]
Substituir uma matriz por um objeto
E funciona ao contrário também:
SELECT json_patch('[ "Fluffy", 10 ]', '{ "name" : "Fluffy", "age" : 10 }');
Resultado:
{"name":"Fluffy","age":10}