Il json_insert()
di SQLite la funzione ci consente di inserire un nuovo valore in un documento JSON.
Passiamo il JSON originale come primo argomento quando chiamiamo la funzione, seguito da un percorso che specifica dove inserire il nuovo valore, seguito dal valore da inserire.
Possiamo anche inserire più coppie chiave/valore, se necessario.
Sintassi
La funzione si chiama così:
json_extract(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.
Esempio
Ecco un esempio di base da dimostrare:
SELECT json_insert('{ "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_insert('{ "a" : 1 }', '$.b', 2, '$.c', 3 );
Risultato:
{"a":1,"b":2,"c":3}
Ho semplicemente aggiunto più argomenti chiave/valore quando ho chiamato json_insert()
.
La chiave/valore esiste già?
Il json_insert()
la funzione non inserirà il valore se la chiave esiste già:
SELECT json_insert('{ "a" : 1 }', '$.a', 2);
Risultato:
{"a":1}
In questo caso, la chiave a
esiste già nel JSON, quindi provare a inserire un nuovo valore per quella chiave non funziona.
Per sostituire un valore, usa json_replace()
o json_set()
.
Inserisci un oggetto
Ecco un esempio di inserimento di un altro documento JSON:
SELECT json_insert('{ "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_insert('{ "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.
Questo è abbastanza giusto però. Dopotutto, abbiamo racchiuso il nuovo valore tra virgolette singole. Come faceva SQLite a sapere se volevamo inserire una stringa o un oggetto JSON?
E non è che possiamo semplicemente rimuovere quelle virgolette singole:
SELECT json_insert('{ "a" : 1 }', '$.b', { "c" : 2 } );
Risultato:
Parse error: unrecognized token: "{" SELECT json_insert('{ "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_insert('{ "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_insert('{ "a" : 1 }', '$.b', json('[ 2, 3, 4 ]'));
Risultato:
{"a":1,"b":[2,3,4]}
Se rimuoviamo json()
funzione, otteniamo questo:
SELECT json_insert('{ "a" : 1 }', '$.b', '[ 2, 3, 4 ]');
Risultato:
{"a":1,"b":"[ 2, 3, 4 ]"}
E se rimuoviamo le virgolette singole, otteniamo un errore:
SELECT json_insert('{ "a" : 1 }', '$.b', [ 2, 3, 4 ]);
Risultato:
Parse error: no such column: 2, 3, 4 SELECT json_insert('{ "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_insert('{ "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_insert()
per aggiungere valori alla fine di un array.
Per fare ciò, usa un indice di matrice di [#]
:
SELECT json_insert('[ 1, 2, 3 ]', '$[#]', 4 );
Risultato:
[1,2,3,4]
Lo stesso principio si applica agli array nidificati:
SELECT json_insert('[ 1, [ "a", "b" ], 3 ]', '$[1][#]', "c" );
Risultato:
[1,["a","b","c"],3]
Percorsi non validi
Riceveremo un errore se il nostro percorso non è ben formato:
SELECT json_insert('{ "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_insert('{ "a" : 1', '$.b', 2);
Risultato:
Runtime error: malformed JSON
Questa volta l'errore ci dice che il nostro JSON non è corretto.