Não é novidade utilizar dados do tipo JSON para troca de informações, consumo de APIs, neste palestra quero mostrar exemplos práticos de como manipular estes dados e tirar um maior proveito deste recurso dentro do PostgreSQL.
Dados Tipo Json Entendendo como usar em situações reais no seu Sistema
2. Waldir Pimentel
Graduado em Sistemas de Informação.
Especialista em Gestão de Negócios para Desenvolvimento Web.
Programador há 15 anos.
10 anos usando Postgres.
Gerente de TI - Telecontrol Networking.
Palestrante telecontrol.com.br
5. JSON
{
"JSON": "(JavaScript Object Notation - Notação de Objetos JavaScript)”,
"Definicao": “É uma formatação leve de troca de dados. Para seres humanos, é fácil de ler
e escrever. Para máquinas, é fácil de interpretar e gerar.",
"Ref.": “www.json.org"
}
6. Antes do 9.3
FUNCTION JSON_FIELD(search, field)
BEGIN
IF POSITION ($1 IN $2) = 0 THEN
RETURN NULL;
END IF;
RETURN REGEXP_REPLACE($2, E'^.*?"'||$1||E'":s?"?([^,"]}]*)"?[,]} ].*$', E'1');
END;
7. TYPES
{
"Version": {
"9.2": {
"TYPE": "JSON"
},
"9.4": {
"TYPE": ["JSON", "JSONB"]
}
}
}
{
"JSON" : "Valida formato Json antes de salvar porém armazena no formato TEXTO",
"JSONB": "Valida formato Json antes de salvar porém armazena no formato BINARIO"
}
13. Operadores
Operador Tipo Descrição
-> Json e JsonB Retorna valor json por uma chave
->> Json e JsonB Retorna valor como texto
#> Json e JsonB
Retorna valor json usando um
caminho
#>> Json e JsonB
Retorna valor texto usando um
caminho
14. Operadores
SELECT request,
request->'api' AS api,
request->'rota' AS rota,
request->'method' AS method,
request->'headers' AS headers,
request->'headers'->'Content-Type' AS contentType,
request->'headers'->'Authorization' AS Authorization
FROM tbl_log_integracao ;
SELECT request,
request->>'api' AS api,
request->>’rota' AS rota,
request->>’method' AS method,
request->>’headers' AS headers,
request->'headers'->>'Content-Type' AS contentType,
request->’headers'->>'Authorization' AS Authorization
FROM tbl_log_integracao ;
15. Operadores
SELECT
request->'api' AS OperadorChaveApi,
pg_typeof(request->'api') AS TypeOperadorChaveApi,
request->>'api' AS OperadorTextoApi,
pg_typeof(request->>'api') AS TypeOperadorTextoapi,
request->'headers' AS OperadorChaveHeaders,
pg_typeof(request->'headers') AS TypeOperadorChaveHeaders,
request->>'headers' AS OperadorTextoHeaders,
pg_typeof(request->>'headers') AS TypeOperadorTextoHeaders
FROM tbl_log_integracao ;
16. Operadores
SELECT
request->>'api' as api,
request->>'rota' as rota,
request->>'method' as method,
request->>'headers' as headers,
request#>'{headers,Content-Type}' as contentType,
request->'headers'->'Authorization' as Authorization
FROM tbl_log_integracao ;
17. Operadores
Operador Tipo Descrição
@> JsonB
Se contém no JSON da esquerda o
valor da direita
<@ JsonB
Se contém na direita valor da es
querda
? JsonB
Verifica se existe a chave dentro do
Json
?| JsonB
Verifica se alguma chave existe no
Json
?& JsonB
Verifica se todas as chaves existem no
Json
18. Indexes
{
"Indexes": {
“Btree": “Usar em uma chave do json, ex: request->api. Pesquisas
com =, like, ilike”,
“GIN”:"Usar em uma coluna tipo jsonB, ex: response. Pesquisa com
contém @>”
}
}
21. Operadores
SELECT log_integracao,
request->>'headers' AS headers,
request->'data' AS data
FROM tbl_log_integracao
WHERE request ?| array['method'];
SELECT log_integracao,
request->>'headers' AS headers,
request->'data' AS data
FROM tbl_log_integracao
WHERE request ?& array['method','teste'];
22. Funções
Função Tipo Descrição
json_set Json/JsonB
Adiciona um elemento + valor em um
Json
row_to_json JsonB
Gera um json com rows de uma
consulta
array_to_json JsonB gera um json através de um array
jsonb_array_elements JsonB Resgata um valor de um array de json
jsonb_each JsonB
gera uma linha para cada campo do
json
jsonb_to_recordset JsonB Gera um recordset de um Json
23. Funções
select row_to_json(json) as json from (select
log_integracao,data_input from tbl_log_integracao) as json;
select jsonb_array_elements(response->'lists')->>'id' as ids,
jsonb_array_elements(response->'lists')->>'name' as names from
tbl_log_integracao where log_integracao = 4;
update tbl_log_integracao set request =
jsonb_set(request,’{data}’,'"2018-08-04"') where log_integracao = 4 ;
24. Funções
select * from jsonb_each((select request from tbl_log_integracao
where log_integracao = 4)) ;
select * from jsonb_each_text((select request from
tbl_log_integracao where log_integracao = 4)) ;
select * from jsonb_each_text((select request->'headers' from
tbl_log_integracao where log_integracao = 4)) ;