SQLite
 sql >> Database >  >> RDS >> SQLite

SQLite JSON_SET()

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.