Il json_set()
di SQLite La funzione ci consente di inserire o sostituire un valore in un documento JSON.
Passiamo il JSON originale come primo argomento quando chiamiamo la funzione, seguito da un percorso che specifica dove inserire/sostituire il nuovo valore, seguito dal valore da inserire/sostituire.
Possiamo anche inserire/sostituire più coppie chiave/valore, se necessario.
Sintassi
Funziona così:
json_set(json, path1, value1, path2, value2...)
Dove json
rappresenta il JSON originale e path1, value1, path2, value2...
sono coppie percorso/valore che possiamo utilizzare per inserire nuovi valori nel documento JSON (o sostituire, a seconda dei casi).
Esempio
Ecco un esempio di base da dimostrare:
SELECT json_set('{ "a" : 1 }', '$.b', 2);
Risultato:
{"a":1,"b":2}
Qui ho inserito una nuova coppia chiave/valore ("b":2
) nel documento JSON.
Possiamo inserire più coppie chiave/valore come questa:
SELECT json_set('{ "a" : 1 }', '$.b', 2, '$.c', 3 );
Risultato:
{"a":1,"b":2,"c":3}
Ho semplicemente aggiunto più argomenti chiave/valore quando ho chiamato json_set()
.
Sostituisci valori
Se la chiave esiste già, il suo valore viene sostituito con il nuovo valore:
SELECT json_set('{ "a" : 1, "b" : 2 }', '$.b', 3);
Risultato:
{"a":1,"b":3}
Questa è la differenza principale tra json_set()
e json_insert()
. Il json_insert()
la funzione non inserirà il valore se la chiave esiste già.
Un altro modo per sostituire i valori è usare json_replace()
.
Inserisci un oggetto
Ecco un esempio di inserimento di un oggetto JSON:
SELECT json_set('{ "a" : 1 }', '$.b', json('{ "c" : 2 }') );
Risultato:
{"a":1,"b":{"c":2}}
In questo caso, ho usato json()
funzione per restituire il mio argomento come stringa JSON. Ecco cosa succede quando non lo faccio:
SELECT json_set('{ "a" : 1 }', '$.b', '{ "c" : 2 }' );
Risultato:
{"a":1,"b":"{ \"c\" : 2 }"}
Il documento JSON viene inserito come valore di testo invece di un oggetto JSON e le sue virgolette doppie vengono quindi salvate con barre inverse.
Tuttavia, la semplice rimozione delle virgolette singole genera un errore:
SELECT json_set('{ "a" : 1 }', '$.b', { "c" : 2 } );
Risultato:
Parse error: unrecognized token: "{" SELECT json_set('{ "a" : 1 }', '$.b', { "c" : 2 } ); error here ---^
Senza virgolette singole o json()
funzione, riceviamo un errore non appena incontra la parentesi graffa sinistra.
Un altro modo per inserire un oggetto JSON è utilizzare json_object()
funzione invece di json()
funzione:
SELECT json_set('{ "a" : 1 }', '$.b', json_object('c', 2) );
Risultato:
{"a":1,"b":{"c":2}}
Inserisci un array
È una cosa simile quando si inseriscono gli array:
SELECT json_set('{ "a" : 1 }', '$.b', json('[ 2, 3, 4 ]'));
Risultato:
{"a":1,"b":[2,3,4]}
Se rimuoviamo json()
funzione, otteniamo questo:
SELECT json_set('{ "a" : 1 }', '$.b', '[ 2, 3, 4 ]');
Risultato:
{"a":1,"b":"[ 2, 3, 4 ]"}
E se rimuoviamo le virgolette singole, otteniamo un errore:
SELECT json_set('{ "a" : 1 }', '$.b', [ 2, 3, 4 ]);
Risultato:
Parse error: no such column: 2, 3, 4 SELECT json_set('{ "a" : 1 }', '$.b', [ 2, 3, 4 ]); error here ---^
In alternativa possiamo usare json_array()
funzione invece di json()
. Quella funzione ti consente di creare un array basato sui suoi argomenti:
SELECT json_set('{ "a" : 1 }', '$.b', json_array( 2, 3, 4 ) );
Risultato:
{"a":1,"b":[2,3,4]}
Aggiungi valori alla fine di un array
Possiamo usare json_set()
per aggiungere valori alla fine di un array.
Per fare ciò, usa un indice di matrice di [#]
:
SELECT json_set('[ 1, 2, 3 ]', '$[#]', 4 );
Risultato:
[1,2,3,4]
Lo stesso principio si applica agli array nidificati:
SELECT json_set('[ 1, [ "a", "b" ], 3 ]', '$[1][#]', "c" );
Risultato:
[1,["a","b","c"],3]
Sostituisci gli elementi dell'array
Possiamo usare json_set()
per sostituire gli elementi nell'array:
SELECT json_set('[ 1, 2, 3 ]', '$[1]', 4 );
Risultato:
[1,4,3]
Gli array sono a base zero, quindi [1]
indica il secondo elemento dell'array.
Il json_replace()
la funzione può essere utilizzata anche per sostituire elementi esistenti. Di nuovo, questo è diverso da json_insert()
, che non sostituisce gli elementi esistenti.
Percorsi non validi
Riceveremo un errore se il nostro percorso non è ben formato:
SELECT json_set('{ "a" : 1 }', 'b', 2);
Risultato:
Runtime error: JSON path error near 'b'
In questo caso, ho dimenticato di includere $.
all'inizio del sentiero.
Documenti JSON non validi
Riceveremo anche un errore che JSON non è ben formato:
SELECT json_set('{ "a" : 1', '$.b', 2);
Risultato:
Runtime error: malformed JSON
Questa volta l'errore ci dice che il nostro JSON non è corretto.