El json_object()
de SQLite La función devuelve un objeto JSON bien formado en función de sus argumentos.
La función acepta cero o más pares de argumentos y devuelve un objeto JSON bien formado basado en esos argumentos.
Sintaxis
json_object(label1,value1,...)
Donde label1, value2, ...
representa los pares etiqueta/valor.
Ejemplo
Aquí hay un ejemplo simple para demostrarlo:
SELECT json_object( "name", "Igor", "age", 35 );
Resultado:
{"name":"Igor","age":35}
Pasar objetos JSON
Pasar un argumento con TEXTO de tipo SQL da como resultado una cadena JSON entrecomillada, con cualquier etiqueta entrecomillada escapada:
SELECT json_object( "user", '{ "name" : "igor", "age" : 35 }' );
Resultado:
{"user":"{ \"name\" : \"igor\", \"age\" : 35 }"}
Si no queremos que esto suceda, podemos usar json()
función para proporcionar el valor como un documento JSON válido:
SELECT json_object( "user", json('{ "name" : "igor", "age" : 35 }') );
Resultado:
{"user":{"name":"igor","age":35}}
Otra forma de hacerlo es usar ->
de SQLite operador:
SELECT json_object( "user", '{ "name" : "igor", "age" : 35 }' -> '$' );
Resultado:
{"user":{"name":"igor","age":35}}
Alternativamente, podemos usar otro json_object()
función:
SELECT json_object( "user", json_object( "name", "Igor", "age", 35 ) );
Resultado:
{"user":{"name":"Igor","age":35}}
Aquí está con algunos otros valores:
SELECT json_object(
"a", 1,
"user", json_object( "name", "Igor", "age", 35 ),
"b", 2
);
Resultado:
{"a":1,"user":{"name":"Igor","age":35},"b":2}
Pasar matrices JSON
Es algo similar al pasar matrices JSON:
SELECT json_object( "scores", '[ 9, 4, 7 ]' );
Resultado:
{"scores":"[ 9, 4, 7 ]"}
En este caso, el valor es una cadena que se asemeja a una matriz.
Para devolver una matriz JSON real, podemos pasar nuestro argumento a json()
función:
SELECT json_object( "scores", json('[ 9, 4, 7 ]') );
Resultado:
{"scores":[9,4,7]}
También podemos usar el ->
operador:
SELECT json_object( "scores", '[ 9, 4, 7 ]' -> '$' );
Resultado:
{"scores":[9,4,7]}
Alternativamente, podemos pasar los valores a json_array()
función:
SELECT json_object( "scores", json_array( 9, 4, 7 ) );
Resultado:
{"scores":[9,4,7]}
Aquí está con algunos otros pares de nombre/valor:
SELECT json_object(
"name", "Bruno",
"scores", json_array( 9, 4, 7 ),
"age", 25
);
Resultado:
{"name":"Bruno","scores":[9,4,7],"age":25}
Crear un objeto vacío
Llamando a json_object()
sin pasar ningún argumento da como resultado un objeto vacío:
SELECT json_object();
Resultado:
{}
Etiquetas duplicadas
Al momento de escribir, json_object()
acepta etiquetas duplicadas sin problemas. Por lo tanto, podemos hacer cosas como esta:
SELECT json_object( "b", 1, "b", 2 );
Resultado:
{"b":1,"b":2}
Pero la documentación de SQLite advierte que es posible que este no sea siempre el caso:es posible que las versiones futuras de SQLite no admitan tales escenarios.
Ejemplo de base de datos
Podemos usar json_object()
al recuperar datos de una base de datos.
Supongamos que ejecutamos la siguiente consulta:
SELECT * FROM Pets;
Resultado:
+-------+---------+--------+ | PetId | PetName | TypeId | +-------+---------+--------+ | 1 | Homer | 3 | | 2 | Yelp | 1 | | 3 | Fluff | 2 | | 4 | Brush | 4 | +-------+---------+--------+
Podemos ver que hay tres columnas y podemos ver sus nombres.
Podemos usar el json_object()
función en esa tabla de esta manera:
SELECT json_object(
'PetId', PetId,
'PetName', PetName,
'TypeId', TypeId
)
FROM Pets;
Resultado:
{"PetId":1,"PetName":"Homer","TypeId":3} {"PetId":2,"PetName":"Yelp","TypeId":1} {"PetId":3,"PetName":"Fluff","TypeId":2} {"PetId":4,"PetName":"Brush","TypeId":4}
Aquí, especifiqué explícitamente los nombres de las etiquetas, luego usé las columnas reales de la base de datos para los valores. Cada fila se convierte en un documento JSON y cada columna se convierte en un par clave/valor en ese documento JSON.
También podemos usar json_group_array()
función para encerrar los documentos en una matriz:
SELECT json_group_array(
json_object(
'PetId', PetId,
'PetName', PetName,
'TypeId', TypeId
)
)
FROM Pets;
Resultado:
[{"PetId":1,"PetName":"Homer","TypeId":3},{"PetId":2,"PetName":"Yelp","TypeId":1},{"PetId":3,"PetName":"Fluff","TypeId":2},{"PetId":4,"PetName":"Brush","TypeId":4}]