O SQLite
json_insert()
A função nos permite inserir um novo valor em um documento JSON. Passamos o JSON original como o primeiro argumento quando chamamos a função, seguido de um caminho que especifica onde inserir o novo valor, seguido do valor a ser inserido.
Também podemos inserir vários pares de chave/valor, se necessário.
Sintaxe
A função é chamada assim:
json_extract(json, path1, value1, path2, value2...)
Onde
json
representa o JSON original e path1, value1, path2, value2...
são pares de caminho/valor que podemos usar para inserir novos valores no documento JSON. Exemplo
Aqui está um exemplo básico para demonstrar:
SELECT json_insert('{ "a" : 1 }', '$.b', 2);
Resultado:
{"a":1,"b":2}
Aqui, inseri um novo par chave/valor (
"b":2
) no documento JSON. Podemos inserir vários pares de chave/valor como este:
SELECT json_insert('{ "a" : 1 }', '$.b', 2, '$.c', 3 );
Resultado:
{"a":1,"b":2,"c":3}
Eu simplesmente adicionei mais argumentos de chave/valor quando chamei
json_insert()
. A chave/valor já existe?
O
json_insert()
a função não inserirá o valor se a chave já existir:SELECT json_insert('{ "a" : 1 }', '$.a', 2);
Resultado:
{"a":1}
Neste caso, a chave
a
já existe no JSON e, portanto, tentar inserir um novo valor para essa chave não funciona. Para substituir um valor, use
json_replace()
ou json_set()
. Inserir um objeto
Aqui está um exemplo de inserção de outro documento JSON:
SELECT json_insert('{ "a" : 1 }', '$.b', json('{ "c" : 2 }') );
Resultado:
{"a":1,"b":{"c":2}}
Nesse caso, usei o
json()
função para retornar meu argumento como uma string JSON. Aqui está o que acontece quando eu não faço isso:SELECT json_insert('{ "a" : 1 }', '$.b', '{ "c" : 2 }' );
Resultado:
{"a":1,"b":"{ \"c\" : 2 }"}
O documento JSON é inserido como um valor de texto em vez de um objeto JSON e, portanto, suas aspas duplas são escapadas com barras invertidas.
Isso é justo o suficiente. Afinal, colocamos o novo valor entre aspas simples. Como o SQLite saberia se queríamos inserir uma string ou um objeto JSON?
E não é como se pudéssemos simplesmente remover essas aspas simples:
SELECT json_insert('{ "a" : 1 }', '$.b', { "c" : 2 } );
Resultado:
Parse error: unrecognized token: "{" SELECT json_insert('{ "a" : 1 }', '$.b', { "c" : 2 } ); error here ---^
Sem aspas simples ou o
json()
função, obtemos um erro assim que encontra a chave esquerda. Outra maneira de inserir um objeto JSON é usar o
json_object()
função em vez do json()
função:SELECT json_insert('{ "a" : 1 }', '$.b', json_object('c', 2) );
Resultado:
{"a":1,"b":{"c":2}}
Inserir uma matriz
É algo semelhante ao inserir matrizes:
SELECT json_insert('{ "a" : 1 }', '$.b', json('[ 2, 3, 4 ]'));
Resultado:
{"a":1,"b":[2,3,4]}
Se removermos o
json()
função, obtemos isso:SELECT json_insert('{ "a" : 1 }', '$.b', '[ 2, 3, 4 ]');
Resultado:
{"a":1,"b":"[ 2, 3, 4 ]"}
E se removermos as aspas simples, obtemos um erro:
SELECT json_insert('{ "a" : 1 }', '$.b', [ 2, 3, 4 ]);
Resultado:
Parse error: no such column: 2, 3, 4 SELECT json_insert('{ "a" : 1 }', '$.b', [ 2, 3, 4 ]); error here ---^
Alternativamente, podemos usar o
json_array()
função em vez de json()
. Essa função permite que você crie uma matriz com base em seus argumentos:SELECT json_insert('{ "a" : 1 }', '$.b', json_array( 2, 3, 4 ) );
Resultado:
{"a":1,"b":[2,3,4]}
Anexar valores ao final de uma matriz
Podemos usar
json_insert()
para acrescentar valores ao final de uma matriz. Para fazer isso, use um índice de matriz de
[#]
:SELECT json_insert('[ 1, 2, 3 ]', '$[#]', 4 );
Resultado:
[1,2,3,4]
O mesmo princípio se aplica a matrizes aninhadas:
SELECT json_insert('[ 1, [ "a", "b" ], 3 ]', '$[1][#]', "c" );
Resultado:
[1,["a","b","c"],3]
Caminhos inválidos
Receberemos um erro se nosso caminho não estiver bem formado:
SELECT json_insert('{ "a" : 1 }', 'b', 2);
Resultado:
Runtime error: JSON path error near 'b'
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_insert('{ "a" : 1', '$.b', 2);
Resultado:
Runtime error: malformed JSON
Desta vez, o erro nos diz que nosso JSON está malformado.