Le SQLite json_set()
permet d'insérer ou de remplacer une valeur dans un document JSON.
Nous passons le JSON d'origine comme premier argument lorsque nous appelons la fonction, suivi d'un chemin qui spécifie où insérer/remplacer la nouvelle valeur, suivi de la valeur à insérer/remplacer.
Nous pouvons également insérer/remplacer plusieurs paires clé/valeur si nécessaire.
Syntaxe
Cela fonctionne comme ceci :
json_set(json, path1, value1, path2, value2...)
Où json
représente le JSON d'origine, et path1, value1, path2, value2...
sont des paires chemin/valeur que nous pouvons utiliser pour insérer de nouvelles valeurs dans le document JSON (ou remplacer, selon le cas).
Exemple
Voici un exemple de base pour illustrer :
SELECT json_set('{ "a" : 1 }', '$.b', 2);
Résultat :
{"a":1,"b":2}
Ici, j'ai inséré une nouvelle paire clé/valeur ("b":2
) dans le document JSON.
Nous pouvons insérer plusieurs paires clé/valeur comme ceci :
SELECT json_set('{ "a" : 1 }', '$.b', 2, '$.c', 3 );
Résultat :
{"a":1,"b":2,"c":3}
J'ai simplement ajouté plus d'arguments clé/valeur lorsque j'ai appelé json_set()
.
Remplacer les valeurs
Si la clé existe déjà, sa valeur est remplacée par la nouvelle valeur :
SELECT json_set('{ "a" : 1, "b" : 2 }', '$.b', 3);
Résultat :
{"a":1,"b":3}
C'est la principale différence entre json_set()
et json_insert()
. Le json_insert()
la fonction n'insérera pas la valeur si la clé existe déjà.
Une autre façon de remplacer les valeurs consiste à utiliser json_replace()
.
Insérer un objet
Voici un exemple d'insertion d'un objet JSON :
SELECT json_set('{ "a" : 1 }', '$.b', json('{ "c" : 2 }') );
Résultat :
{"a":1,"b":{"c":2}}
Dans ce cas, j'ai utilisé le json()
fonction pour renvoyer mon argument sous forme de chaîne JSON. Voici ce qui se passe lorsque je ne le fais pas :
SELECT json_set('{ "a" : 1 }', '$.b', '{ "c" : 2 }' );
Résultat :
{"a":1,"b":"{ \"c\" : 2 }"}
Le document JSON est inséré en tant que valeur texte au lieu d'un objet JSON, et ses guillemets doubles sont donc échappés avec des barres obliques inverses.
Cependant, la simple suppression des guillemets simples entraîne une erreur :
SELECT json_set('{ "a" : 1 }', '$.b', { "c" : 2 } );
Résultat :
Parse error: unrecognized token: "{" SELECT json_set('{ "a" : 1 }', '$.b', { "c" : 2 } ); error here ---^
Sans guillemets simples ni json()
fonction, nous obtenons une erreur dès qu'elle rencontre l'accolade gauche.
Une autre façon d'insérer un objet JSON est d'utiliser le json_object()
fonction au lieu de json()
fonction :
SELECT json_set('{ "a" : 1 }', '$.b', json_object('c', 2) );
Résultat :
{"a":1,"b":{"c":2}}
Insérer un tableau
C'est la même chose lors de l'insertion de tableaux :
SELECT json_set('{ "a" : 1 }', '$.b', json('[ 2, 3, 4 ]'));
Résultat :
{"a":1,"b":[2,3,4]}
Si nous supprimons le json()
fonction, nous obtenons ceci :
SELECT json_set('{ "a" : 1 }', '$.b', '[ 2, 3, 4 ]');
Résultat :
{"a":1,"b":"[ 2, 3, 4 ]"}
Et si nous supprimons les guillemets simples, nous obtenons une erreur :
SELECT json_set('{ "a" : 1 }', '$.b', [ 2, 3, 4 ]);
Résultat :
Parse error: no such column: 2, 3, 4 SELECT json_set('{ "a" : 1 }', '$.b', [ 2, 3, 4 ]); error here ---^
Nous pouvons également utiliser le json_array()
fonction au lieu de json()
. Cette fonction vous permet de créer un tableau basé sur ses arguments :
SELECT json_set('{ "a" : 1 }', '$.b', json_array( 2, 3, 4 ) );
Résultat :
{"a":1,"b":[2,3,4]}
Ajouter des valeurs à la fin d'un tableau
Nous pouvons utiliser json_set()
pour ajouter des valeurs à la fin d'un tableau.
Pour ce faire, utilisez un index de tableau de [#]
:
SELECT json_set('[ 1, 2, 3 ]', '$[#]', 4 );
Résultat :
[1,2,3,4]
Le même principe s'applique aux tableaux imbriqués :
SELECT json_set('[ 1, [ "a", "b" ], 3 ]', '$[1][#]', "c" );
Résultat :
[1,["a","b","c"],3]
Remplacer les éléments du tableau
Nous pouvons utiliser json_set()
pour remplacer les éléments du tableau :
SELECT json_set('[ 1, 2, 3 ]', '$[1]', 4 );
Résultat :
[1,4,3]
Les tableaux sont basés sur zéro, et donc [1]
indique le deuxième élément du tableau.
Le json_replace()
La fonction peut également être utilisée pour remplacer des éléments existants. Encore une fois, c'est différent de json_insert()
, qui ne remplace pas les éléments existants.
Chemins non valides
Nous aurons une erreur si notre chemin n'est pas bien formé :
SELECT json_set('{ "a" : 1 }', 'b', 2);
Résultat :
Runtime error: JSON path error near 'b'
Dans ce cas, j'ai oublié d'inclure $.
au début du chemin.
Documents JSON non valides
Nous aurons également une erreur, le JSON n'est pas bien formé :
SELECT json_set('{ "a" : 1', '$.b', 2);
Résultat :
Runtime error: malformed JSON
Cette fois, l'erreur nous indique que notre JSON est malformé.