En SQLite, el json_patch()
La función se puede utilizar para agregar, modificar o eliminar elementos de un objeto JSON.
Para hacer esto, ejecuta el algoritmo RFC-7396 MergePatch para aplicar un parche dado contra la entrada JSON dada.
Pasamos el JSON original como primer argumento cuando llamamos a la función, seguido del parche. Luego, la función aplica ese parche contra JSON en el primer argumento.
Sintaxis
La sintaxis es así:
json_patch(T,P)
Donde T
representa el JSON original y P
es el parche. La función aplica parche P
contra T
.
El contenido del parche proporcionado P
se compara con el contenido actual del documento JSON de destino T
. Si P
contiene miembros que no aparecen en T
, esos miembros se agregan. Si T
contiene el miembro, el valor se reemplaza.
Valores nulos en P
tienen un significado especial para indicar la eliminación de valores existentes en T
.
Ejemplos
Aquí hay algunos ejemplos para demostrar.
Insertar
SELECT json_patch('{ "name" : "Fluffy" }', '{ "age" : 10 }');
Resultado:
{"name":"Fluffy","age":10}
Intentar insertar un nuevo miembro con un valor nulo no funciona:
SELECT json_patch('{ "name" : "Fluffy" }', '{ "age" : null }');
Resultado:
{"name":"Fluffy"}
Los valores nulos en realidad se usan para eliminar miembros del JSON (como se ve en un ejemplo posterior).
Actualizar
SELECT json_patch('{ "name" : "Fluffy" }', '{ "name" : "Baldy" }');
Resultado:
{"name":"Baldy"}
Si hay múltiples pares clave/valor, pero solo queremos actualizar uno, solo necesitamos especificar ese en nuestro segundo argumento:
SELECT json_patch('{ "name" : "Fluffy", "age" : 10 }', '{ "name" : "Baldy" }');
Resultado:
{"name":"Baldy","age":10}
El mismo concepto se aplica cuando se actualizan varios pares clave/valor; solo necesitamos especificar esos:
SELECT json_patch('{
"name" : "Fluffy",
"type" : "Cat",
"age" : 10
}',
'{
"name" : "Baldy",
"age" : 11
}'
);
Resultado:
{"name":"Baldy","type":"Cat","age":11}
Actualizar e insertar
SELECT json_patch('{ "name" : "Fluffy" }', '{ "name" : "Baldy", "age" : 10 }');
Resultado:
{"name":"Baldy","age":10}
Borrar/Quitar
Los valores nulos en el parche de combinación tienen un significado especial para indicar la eliminación de valores existentes en el destino:
SELECT json_patch('{ "name" : "Fluffy", "age" : 10 }', '{ "age" : null }');
Resultado:
{"name":"Fluffy"}
Arreglos
El json_patch()
La función no puede agregar elementos a una matriz, ni modificar elementos individuales de una matriz. Solo puede insertar, reemplazar o eliminar toda la matriz como una sola unidad.
Entonces, aquí hay un ejemplo de agregar un elemento a una matriz:
SELECT json_patch('[ 1, 2, 3 ]', '[ 1, 2, 3, 4 ]');
Resultado:
[1,2,3,4]
Tuve que reemplazar la matriz original por una completamente nueva. Entonces, técnicamente, en realidad no agregué nada, simplemente reemplacé toda la matriz con otra.
El mismo concepto se aplica si la matriz está dentro de un objeto:
SELECT json_patch('{ "scores" : [ 1, 2, 3 ] }', '{ "scores" : [ 1, 2, 3, 4 ] }');
Resultado:
{"scores":[1,2,3,4]}
Si necesita trabajar con matrices, pruebe funciones como json_set()
, json_insert()
, json_remove()
y json_replace()
en su lugar.
Reemplazar un objeto con una matriz
Podemos reemplazar objetos con una matriz simplemente proporcionando una matriz como parche:
SELECT json_patch('{ "name" : "Fluffy", "age" : 10 }', '[ "Fluffy", 10 ]');
Resultado:
["Fluffy",10]
Reemplazar una matriz con un objeto
Y también funciona al revés:
SELECT json_patch('[ "Fluffy", 10 ]', '{ "name" : "Fluffy", "age" : 10 }');
Resultado:
{"name":"Fluffy","age":10}