SQLite json_object()
funktion returnerer et velformet JSON-objekt baseret på dets argumenter.
Funktionen accepterer nul eller flere par af argumenter og returnerer et velformet JSON-objekt baseret på disse argumenter.
Syntaks
json_object(label1,value1,...)
Hvor etiket1, værdi2, ...
repræsenterer etiket/værdi-parrene.
Eksempel
Her er et simpelt eksempel til at demonstrere:
SELECT json_object( "name", "Igor", "age", 35 );
Resultat:
{"name":"Igor","age":35}
Beståelse af JSON-objekter
Sending af et argument med SQL-typen TEXT resulterer i en citeret JSON-streng, hvor alle etiketter med anførselstegn escapes:
SELECT json_object( "user", '{ "name" : "igor", "age" : 35 }' );
Resultat:
{"user":"{ \"name\" : \"igor\", \"age\" : 35 }"}
Hvis vi ikke ønsker, at dette skal ske, kan vi bruge json()
funktion til at angive værdien som et gyldigt JSON-dokument:
SELECT json_object( "user", json('{ "name" : "igor", "age" : 35 }') );
Resultat:
{"user":{"name":"igor","age":35}}
En anden måde at gøre det på er at bruge SQLites ->
operatør:
SELECT json_object( "user", '{ "name" : "igor", "age" : 35 }' -> '$' );
Resultat:
{"user":{"name":"igor","age":35}}
Alternativt kan vi bruge en anden json_object()
funktion:
SELECT json_object( "user", json_object( "name", "Igor", "age", 35 ) );
Resultat:
{"user":{"name":"Igor","age":35}}
Her er det med nogle andre værdier:
SELECT json_object(
"a", 1,
"user", json_object( "name", "Igor", "age", 35 ),
"b", 2
);
Resultat:
{"a":1,"user":{"name":"Igor","age":35},"b":2}
Beståer JSON-arrays
Det er en lignende ting, når du sender JSON-arrays:
SELECT json_object( "scores", '[ 9, 4, 7 ]' );
Resultat:
{"scores":"[ 9, 4, 7 ]"}
I dette tilfælde er værdien en streng, der ligner en matrix.
For at returnere et faktisk JSON-array kan vi videregive vores argument til json()
funktion:
SELECT json_object( "scores", json('[ 9, 4, 7 ]') );
Resultat:
{"scores":[9,4,7]}
Vi kan også bruge
SELECT json_object( "scores", '[ 9, 4, 7 ]' -> '$' );
Resultat:
{"scores":[9,4,7]}
Alternativt kan vi sende værdierne til json_array()
funktion:
SELECT json_object( "scores", json_array( 9, 4, 7 ) );
Resultat:
{"scores":[9,4,7]}
Her er den med nogle andre navne/værdipar:
SELECT json_object(
"name", "Bruno",
"scores", json_array( 9, 4, 7 ),
"age", 25
);
Resultat:
{"name":"Bruno","scores":[9,4,7],"age":25}
Opret et tomt objekt
Kalder json_object()
uden at sende nogen argumenter resulterer det i et tomt objekt:
SELECT json_object();
Resultat:
{}
Dublerede etiketter
I skrivende stund, json_object()
accepterer duplikerede etiketter uden problemer. Derfor kan vi gøre ting som dette:
SELECT json_object( "b", 1, "b", 2 );
Resultat:
{"b":1,"b":2}
Men SQLites dokumentation anbefaler, at dette ikke altid er tilfældet - fremtidige versioner af SQLite understøtter muligvis ikke sådanne scenarier.
Databaseeksempel
Vi kan bruge json_object()
når du henter data fra en database.
Antag, at vi kører følgende forespørgsel:
SELECT * FROM Pets;
Resultat:
+-------+---------+--------+ | PetId | PetName | TypeId | +-------+---------+--------+ | 1 | Homer | 3 | | 2 | Yelp | 1 | | 3 | Fluff | 2 | | 4 | Brush | 4 | +-------+---------+--------+
Vi kan se, at der er tre kolonner, og vi kan se deres navne.
Vi kan bruge json_object()
funktion på den tabel som denne:
SELECT json_object(
'PetId', PetId,
'PetName', PetName,
'TypeId', TypeId
)
FROM Pets;
Resultat:
{"PetId":1,"PetName":"Homer","TypeId":3} {"PetId":2,"PetName":"Yelp","TypeId":1} {"PetId":3,"PetName":"Fluff","TypeId":2} {"PetId":4,"PetName":"Brush","TypeId":4}
Her specificerede jeg eksplicit etiketnavnene og brugte derefter de faktiske kolonner fra databasen til værdierne. Hver række bliver et JSON-dokument, og hver kolonne bliver et nøgle/værdi-par i det pågældende JSON-dokument.
Vi kan også bruge json_group_array()
funktion til at indkapsle dokumenterne i et array:
SELECT json_group_array(
json_object(
'PetId', PetId,
'PetName', PetName,
'TypeId', TypeId
)
)
FROM Pets;
Resultat:
[{"PetId":1,"PetName":"Homer","TypeId":3},{"PetId":2,"PetName":"Yelp","TypeId":1},{"PetId":3,"PetName":"Fluff","TypeId":2},{"PetId":4,"PetName":"Brush","TypeId":4}]