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

SQLite JSON_OBJECT()

Il json_object() di SQLite La funzione restituisce un oggetto JSON ben formato in base ai suoi argomenti.

La funzione accetta zero o più coppie di argomenti e restituisce un oggetto JSON ben formato basato su tali argomenti.

Sintassi

json_object(label1,value1,...)

Dove label1, value2, ... rappresenta le coppie etichetta/valore.

Esempio

Ecco un semplice esempio da dimostrare:

SELECT json_object( "name", "Igor", "age", 35 );

Risultato:

{"name":"Igor","age":35}

Trasferimento di oggetti JSON

Il passaggio di un argomento con tipo SQL TEXT genera una stringa JSON tra virgolette, con l'escape di tutte le etichette tra virgolette:

SELECT json_object( "user", '{ "name" : "igor", "age" : 35 }' );

Risultato:

{"user":"{ \"name\" : \"igor\", \"age\" : 35 }"}

Se non vogliamo che ciò accada, possiamo usare json() funzione per fornire il valore come documento JSON valido:

SELECT json_object( "user", json('{ "name" : "igor", "age" : 35 }') );

Risultato:

{"user":{"name":"igor","age":35}}

Un altro modo per farlo è usare -> di SQLite operatore:

SELECT json_object( "user", '{ "name" : "igor", "age" : 35 }' -> '$' );

Risultato:

{"user":{"name":"igor","age":35}}

In alternativa, possiamo usare un altro json_object() funzione:

SELECT json_object( "user", json_object( "name", "Igor", "age", 35 ) );

Risultato:

{"user":{"name":"Igor","age":35}}

Eccolo con alcuni altri valori:

SELECT json_object( 
    "a", 1, 
    "user", json_object( "name", "Igor", "age", 35 ), 
    "b", 2 
    );

Risultato:

{"a":1,"user":{"name":"Igor","age":35},"b":2}

Passaggio di array JSON

È una cosa simile quando si passano gli array JSON:

SELECT json_object( "scores", '[ 9, 4, 7 ]' );

Risultato:

{"scores":"[ 9, 4, 7 ]"}

In questo caso, il valore è una stringa che assomiglia a una matrice.

Per restituire un vero array JSON, possiamo passare il nostro argomento a json() funzione:

SELECT json_object( "scores", json('[ 9, 4, 7 ]') );

Risultato:

{"scores":[9,4,7]}

Possiamo anche usare il -> operatore:

SELECT json_object( "scores", '[ 9, 4, 7 ]' -> '$' );

Risultato:

{"scores":[9,4,7]}

In alternativa, possiamo passare i valori a json_array() funzione:

SELECT json_object( "scores", json_array( 9, 4, 7 ) );

Risultato:

{"scores":[9,4,7]}

Eccolo con alcune altre coppie nome/valore:

SELECT json_object( 
    "name", "Bruno", 
    "scores", json_array( 9, 4, 7 ), 
    "age", 25 
    );

Risultato:

{"name":"Bruno","scores":[9,4,7],"age":25}

Crea un oggetto vuoto

Chiamando json_object() senza passare alcun argomento risulta in un oggetto vuoto:

SELECT json_object();

Risultato:

{}

Etichette duplicate

Al momento della scrittura, json_object() accetta etichette duplicate senza problemi. Pertanto, possiamo fare cose come questa:

SELECT json_object( "b", 1, "b", 2 );

Risultato:

{"b":1,"b":2}

Ma la documentazione di SQLite avverte che potrebbe non essere sempre così:le versioni future di SQLite potrebbero non supportare tali scenari.

Esempio di database

Possiamo usare json_object() quando si recuperano dati da un database.

Supponiamo di eseguire la seguente query:

SELECT * FROM Pets;

Risultato:

+-------+---------+--------+
| PetId | PetName | TypeId |
+-------+---------+--------+
| 1     | Homer   | 3      |
| 2     | Yelp    | 1      |
| 3     | Fluff   | 2      |
| 4     | Brush   | 4      |
+-------+---------+--------+

Possiamo vedere che ci sono tre colonne e possiamo vedere i loro nomi.

Possiamo usare json_object() funzione su quella tabella in questo modo:

SELECT json_object( 
    'PetId', PetId, 
    'PetName', PetName,
    'TypeId', TypeId 
    )
FROM Pets;

Risultato:

{"PetId":1,"PetName":"Homer","TypeId":3}
{"PetId":2,"PetName":"Yelp","TypeId":1}
{"PetId":3,"PetName":"Fluff","TypeId":2}
{"PetId":4,"PetName":"Brush","TypeId":4}

Qui, ho specificato esplicitamente i nomi delle etichette, quindi ho utilizzato le colonne effettive del database per i valori. Ogni riga diventa un documento JSON e ogni colonna diventa una coppia chiave/valore in quel documento JSON.

Possiamo anche usare json_group_array() funzione per racchiudere i documenti in un array:

SELECT json_group_array( 
        json_object(
        'PetId', PetId, 
        'PetName', PetName,
        'TypeId', TypeId 
        )
    )
FROM Pets;

Risultato:

[{"PetId":1,"PetName":"Homer","TypeId":3},{"PetId":2,"PetName":"Yelp","TypeId":1},{"PetId":3,"PetName":"Fluff","TypeId":2},{"PetId":4,"PetName":"Brush","TypeId":4}]