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}]