Dans SQLite, le json_patch()
La fonction peut être utilisée pour ajouter, modifier ou supprimer des éléments d'un objet JSON.
Pour ce faire, il exécute l'algorithme RFC-7396 MergePatch pour appliquer un correctif donné à l'entrée JSON donnée.
Nous passons le JSON d'origine comme premier argument lorsque nous appelons la fonction, suivi du patch. La fonction applique ensuite ce correctif à JSON dans le premier argument.
Syntaxe
La syntaxe ressemble à ceci :
json_patch(T,P)
Où T
représente le JSON d'origine, et P
est le patch. La fonction applique le patch P
contre T
.
Le contenu du patch fourni P
est comparé au contenu actuel du document JSON cible T
. Si P
contient des membres qui n'apparaissent pas dans T
, ces membres sont ajoutés. Si T
contient le membre, la valeur est remplacée.
Valeurs nulles dans P
ont une signification spéciale pour indiquer la suppression des valeurs existantes dans T
.
Exemples
Voici quelques exemples à démontrer.
Insérer
SELECT json_patch('{ "name" : "Fluffy" }', '{ "age" : 10 }');
Résultat :
{"name":"Fluffy","age":10}
Essayer d'insérer un nouveau membre avec une valeur nulle ne fonctionne pas :
SELECT json_patch('{ "name" : "Fluffy" }', '{ "age" : null }');
Résultat :
{"name":"Fluffy"}
Les valeurs nulles sont en fait utilisées pour supprimer des membres du JSON (comme on le verra dans un exemple ultérieur).
Mettre à jour
SELECT json_patch('{ "name" : "Fluffy" }', '{ "name" : "Baldy" }');
Résultat :
{"name":"Baldy"}
S'il existe plusieurs paires clé/valeur, mais que nous ne voulons en mettre à jour qu'une seule, nous n'avons qu'à spécifier celle-ci dans notre deuxième argument :
SELECT json_patch('{ "name" : "Fluffy", "age" : 10 }', '{ "name" : "Baldy" }');
Résultat :
{"name":"Baldy","age":10}
Le même concept s'applique lors de la mise à jour de plusieurs paires clé/valeur - nous n'avons qu'à spécifier celles-ci :
SELECT json_patch('{
"name" : "Fluffy",
"type" : "Cat",
"age" : 10
}',
'{
"name" : "Baldy",
"age" : 11
}'
);
Résultat :
{"name":"Baldy","type":"Cat","age":11}
Mettre à jour et insérer
SELECT json_patch('{ "name" : "Fluffy" }', '{ "name" : "Baldy", "age" : 10 }');
Résultat :
{"name":"Baldy","age":10}
Supprimer/Supprimer
Les valeurs nulles dans le patch de fusion ont une signification particulière pour indiquer la suppression des valeurs existantes dans la cible :
SELECT json_patch('{ "name" : "Fluffy", "age" : 10 }', '{ "age" : null }');
Résultat :
{"name":"Fluffy"}
Tableaux
Le json_patch()
La fonction ne peut pas ajouter d'éléments à un tableau, ni modifier des éléments individuels d'un tableau. Il peut uniquement insérer, remplacer ou supprimer l'ensemble du tableau en une seule unité.
Voici donc un exemple d'ajout d'un élément à un tableau :
SELECT json_patch('[ 1, 2, 3 ]', '[ 1, 2, 3, 4 ]');
Résultat :
[1,2,3,4]
J'ai dû remplacer le tableau d'origine par un tout nouveau. Donc techniquement, je n'ai rien ajouté - j'ai simplement remplacé tout le tableau par un autre.
Le même concept s'applique si le tableau se trouve dans un objet :
SELECT json_patch('{ "scores" : [ 1, 2, 3 ] }', '{ "scores" : [ 1, 2, 3, 4 ] }');
Résultat :
{"scores":[1,2,3,4]}
Si vous devez travailler avec des tableaux, essayez des fonctions telles que json_set()
, json_insert()
, json_remove()
et json_replace()
à la place.
Remplacer un objet par un tableau
Nous pouvons remplacer les objets par un tableau en fournissant simplement un tableau comme patch :
SELECT json_patch('{ "name" : "Fluffy", "age" : 10 }', '[ "Fluffy", 10 ]');
Résultat :
["Fluffy",10]
Remplacer un tableau par un objet
Et ça marche aussi dans l'autre sens :
SELECT json_patch('[ "Fluffy", 10 ]', '{ "name" : "Fluffy", "age" : 10 }');
Résultat :
{"name":"Fluffy","age":10}