El json_insert()
de SQLite La función nos permite insertar un nuevo valor en un documento JSON.
Pasamos el JSON original como primer argumento cuando llamamos a la función, seguido de una ruta que especifica dónde insertar el nuevo valor, seguido del valor a insertar.
También podemos insertar varios pares clave/valor si es necesario.
Sintaxis
La función se llama así:
json_extract(json, path1, value1, path2, value2...)
donde json
representa el JSON original y path1, value1, path2, value2...
son pares de ruta/valor que podemos usar para insertar nuevos valores en el documento JSON.
Ejemplo
Aquí hay un ejemplo básico para demostrarlo:
SELECT json_insert('{ "a" : 1 }', '$.b', 2);
Resultado:
{"a":1,"b":2}
Aquí, inserté un nuevo par clave/valor ("b":2
) en el documento JSON.
Podemos insertar múltiples pares clave/valor como este:
SELECT json_insert('{ "a" : 1 }', '$.b', 2, '$.c', 3 );
Resultado:
{"a":1,"b":2,"c":3}
Simplemente agregué más argumentos clave/valor cuando llamé a json_insert()
.
¿La clave/valor ya existe?
El json_insert()
la función no insertará el valor si la clave ya existe:
SELECT json_insert('{ "a" : 1 }', '$.a', 2);
Resultado:
{"a":1}
En este caso, la tecla a
ya existe en el JSON, por lo que intentar insertar un nuevo valor para esa clave no funciona.
Para reemplazar un valor, use json_replace()
o json_set()
.
Insertar un Objeto
Este es un ejemplo de cómo insertar otro documento JSON:
SELECT json_insert('{ "a" : 1 }', '$.b', json('{ "c" : 2 }') );
Resultado:
{"a":1,"b":{"c":2}}
En este caso, utilicé json()
función para devolver mi argumento como una cadena JSON. Esto es lo que sucede cuando no hago eso:
SELECT json_insert('{ "a" : 1 }', '$.b', '{ "c" : 2 }' );
Resultado:
{"a":1,"b":"{ \"c\" : 2 }"}
El documento JSON se inserta como un valor de texto en lugar de un objeto JSON y, por lo tanto, sus comillas dobles se escapan con barras invertidas.
Sin embargo, esto es bastante justo. Después de todo, encerramos el nuevo valor entre comillas simples. ¿Cómo sabía SQLite si queríamos insertar una cadena o un objeto JSON?
Y no es como si simplemente pudiéramos eliminar esas comillas simples:
SELECT json_insert('{ "a" : 1 }', '$.b', { "c" : 2 } );
Resultado:
Parse error: unrecognized token: "{" SELECT json_insert('{ "a" : 1 }', '$.b', { "c" : 2 } ); error here ---^
Sin comillas simples o json()
función, obtenemos un error tan pronto como encuentra la llave izquierda.
Otra forma de insertar un objeto JSON es usar json_object()
función en lugar de json()
función:
SELECT json_insert('{ "a" : 1 }', '$.b', json_object('c', 2) );
Resultado:
{"a":1,"b":{"c":2}}
Insertar una matriz
Es algo similar al insertar arreglos:
SELECT json_insert('{ "a" : 1 }', '$.b', json('[ 2, 3, 4 ]'));
Resultado:
{"a":1,"b":[2,3,4]}
Si eliminamos el json()
función, obtenemos esto:
SELECT json_insert('{ "a" : 1 }', '$.b', '[ 2, 3, 4 ]');
Resultado:
{"a":1,"b":"[ 2, 3, 4 ]"}
Y si eliminamos las comillas simples, obtenemos un error:
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 json_array()
función en lugar de json()
. Esa función le permite crear una matriz basada en sus argumentos:
SELECT json_insert('{ "a" : 1 }', '$.b', json_array( 2, 3, 4 ) );
Resultado:
{"a":1,"b":[2,3,4]}
Agregar valores al final de una matriz
Podemos usar json_insert()
para agregar valores al final de una matriz.
Para hacer esto, use un índice de matriz de [#]
:
SELECT json_insert('[ 1, 2, 3 ]', '$[#]', 4 );
Resultado:
[1,2,3,4]
El mismo principio se aplica a las matrices anidadas:
SELECT json_insert('[ 1, [ "a", "b" ], 3 ]', '$[1][#]', "c" );
Resultado:
[1,["a","b","c"],3]
Rutas no válidas
Obtendremos un error si nuestra ruta no está bien formada:
SELECT json_insert('{ "a" : 1 }', 'b', 2);
Resultado:
Runtime error: JSON path error near 'b'
En este caso, olvidé incluir $.
al frente del camino.
Documentos JSON no válidos
También obtendremos un error de que JSON no está bien formado:
SELECT json_insert('{ "a" : 1', '$.b', 2);
Resultado:
Runtime error: malformed JSON
Esta vez el error nos dice que nuestro JSON está mal formado.