O SQLite
json_object()
A função retorna um objeto JSON bem formado com base em seus argumentos. A função aceita zero ou mais pares de argumentos e retorna um objeto JSON bem formado com base nesses argumentos.
Sintaxe
json_object(label1,value1,...)
Onde
label1, value2, ...
representa os pares rótulo/valor. Exemplo
Aqui está um exemplo simples para demonstrar:
SELECT json_object( "name", "Igor", "age", 35 );
Resultado:
{"name":"Igor","age":35}
Passando objetos JSON
Passar um argumento com o tipo SQL TEXT resulta em uma string JSON entre aspas, com qualquer rótulo entre aspas sendo escapado:
SELECT json_object( "user", '{ "name" : "igor", "age" : 35 }' );
Resultado:
{"user":"{ \"name\" : \"igor\", \"age\" : 35 }"}
Se não quisermos que isso aconteça, podemos usar o
json()
função para fornecer o valor como um documento JSON válido:SELECT json_object( "user", json('{ "name" : "igor", "age" : 35 }') );
Resultado:
{"user":{"name":"igor","age":35}}
Outra maneira de fazer isso é usar o
->
do SQLite operador:SELECT json_object( "user", '{ "name" : "igor", "age" : 35 }' -> '$' );
Resultado:
{"user":{"name":"igor","age":35}}
Alternativamente, podemos usar outro
json_object()
função:SELECT json_object( "user", json_object( "name", "Igor", "age", 35 ) );
Resultado:
{"user":{"name":"Igor","age":35}}
Aqui está com alguns outros 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}
Passando matrizes JSON
É algo semelhante ao passar matrizes JSON:
SELECT json_object( "scores", '[ 9, 4, 7 ]' );
Resultado:
{"scores":"[ 9, 4, 7 ]"}
Nesse caso, o valor é uma string que se assemelha a uma matriz.
Para retornar um array JSON real, podemos passar nosso argumento para o
json()
função:SELECT json_object( "scores", json('[ 9, 4, 7 ]') );
Resultado:
{"scores":[9,4,7]}
Também podemos usar o
->
operador:SELECT json_object( "scores", '[ 9, 4, 7 ]' -> '$' );
Resultado:
{"scores":[9,4,7]}
Alternativamente, podemos passar os valores para o
json_array()
função:SELECT json_object( "scores", json_array( 9, 4, 7 ) );
Resultado:
{"scores":[9,4,7]}
Aqui está com alguns outros pares de nome/valor:
SELECT json_object(
"name", "Bruno",
"scores", json_array( 9, 4, 7 ),
"age", 25
);
Resultado:
{"name":"Bruno","scores":[9,4,7],"age":25}
Criar um objeto vazio
Chamando
json_object()
sem passar nenhum argumento resulta em um objeto vazio:SELECT json_object();
Resultado:
{}
Rótulos duplicados
No momento da escrita,
json_object()
aceita etiquetas duplicadas sem problemas. Portanto, podemos fazer coisas assim:SELECT json_object( "b", 1, "b", 2 );
Resultado:
{"b":1,"b":2}
Mas a documentação do SQLite informa que nem sempre é esse o caso – versões futuras do SQLite podem não suportar tais cenários.
Exemplo de banco de dados
Podemos usar
json_object()
ao recuperar dados de um banco de dados. Suponha que executemos a seguinte consulta:
SELECT * FROM Pets;
Resultado:
+-------+---------+--------+ | PetId | PetName | TypeId | +-------+---------+--------+ | 1 | Homer | 3 | | 2 | Yelp | 1 | | 3 | Fluff | 2 | | 4 | Brush | 4 | +-------+---------+--------+
Podemos ver que existem três colunas e podemos ver seus nomes.
Podemos usar o
json_object()
função nessa tabela assim: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}
Aqui, especifiquei explicitamente os nomes dos rótulos e usei as colunas reais do banco de dados para os valores. Cada linha se torna um documento JSON e cada coluna se torna um par chave/valor nesse documento JSON.
Também podemos usar o
json_group_array()
função para encerrar os documentos em uma 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}]