SQLite
 sql >> Base de Dados >  >> RDS >> SQLite

SQLite JSON_OBJECT()


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