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.