Como converter um XML para JSON em PL/SQL usando as funções do Oracle 19c
XML e JSON são dois formatos populares para trocar dados entre sistemas. XML é um formato baseado em marcação que usa tags para definir a estrutura e o conteúdo dos dados. JSON é um formato baseado em texto que usa objetos e arrays para representar os dados. Ambos os formatos são amplamente suportados por várias linguagens de programação e ferramentas.
Mas e se você quiser converter um XML para JSON em PL/SQL? PL/SQL é uma linguagem de programação procedural que é usada para interagir com bancos de dados Oracle. PL/SQL tem suporte nativo para manipular XML, mas não para JSON. Então, como você pode fazer essa conversão de forma eficiente e confiável usando as funções do Oracle 19c?
O Oracle 19c inclui várias melhorias na funcionalidade JSON no banco de dados. Neste artigo, vamos ver algumas dessas funções e como usá-las para converter um XML para JSON em PL/SQL. Vamos usar o seguinte XML como exemplo:
<livro>
<titulo>O Guia do Mochileiro das Galáxias</titulo>
<autor>Douglas Adams</autor>
<ano>1979</ano>
</livro>
Usando a função JSON_OBJECT
A função JSON_OBJECT é uma função SQL que cria um objeto JSON a partir de uma lista de pares chave-valor. Você pode usar essa função em conjunto com as funções xmltable e xmlquery, que permitem extrair dados de um XML usando XPath ou XQuery. Veja um exemplo de uso:
declare
v_xml xmltype;
v_json clob;
begin
-- Cria um XMLType a partir de uma string
v_xml := xmltype('<livro><titulo>O Guia do Mochileiro das Galáxias</titulo><autor>Douglas Adams</autor><ano>1979</ano></livro>');
-- Converte o XMLType para um CLOB usando a função json_object e as funções xmltable e xmlquery
select json_object(
'livro' value json_object(
'titulo' value titulo,
'autor' value autor,
'ano' value ano
)
)
into v_json
from xmltable(
'/livro'
passing v_xml
columns
titulo varchar2(100) path 'titulo',
autor varchar2(100) path 'autor',
ano number path 'ano'
);
-- Imprime o resultado na saída padrão
dbms_output.put_line(v_json);
end;
/
O resultado é:
{"livro":{"titulo":"O Guia do Mochileiro das Galáxias","autor":"Douglas Adams","ano":1979}}
Essa função tem a vantagem de ser nativa do Oracle Database, o que significa que você não precisa instalar nenhuma biblioteca externa e que você pode usar a função json_object em qualquer consulta SQL. Além disso, essa função pode ser mais rápida e precisa do que outras opções, pois a conversão é feita diretamente pelo banco de dados, sem a criação de objetos intermediários.
No entanto, essa função também tem algumas desvantagens. Primeiro, você precisa ter a versão 12.2 ou superior do Oracle Database, o que pode não ser o caso de todos os usuários. Segundo, você precisa escrever uma consulta SQL complexa, que pode ser difícil de entender e manter. Terceiro, você precisa conhecer bem a estrutura e o conteúdo do XML, pois você precisa especificar os nomes e os tipos dos elementos e atributos que você quer converter.
Usando a função JSON_SERIALIZE
A função JSON_SERIALIZE é uma função SQL que converte um documento JSON de qualquer tipo de dados suportado para texto. Você pode usar essa função em conjunto com a função json_object, que permite criar um objeto JSON a partir de um XMLType. Veja um exemplo de uso:
declare
v_xml xmltype;
v_json clob;
begin
-- Cria um XMLType a partir de uma string
v_xml := xmltype('<livro><titulo>O Guia do Mochileiro das Galáxias</titulo><autor>Douglas Adams</autor><ano>1979</ano></livro>');
-- Converte o XMLType para um CLOB usando a função json_serialize e a função json_object
select json_serialize(
json_object(
'livro' value json_object(
'titulo' value xmlquery('/livro/titulo/text()' passing v_xml returning content),
'autor' value xmlquery('/livro/autor/text()' passing v_xml returning content),
'ano' value xmlquery('/livro/ano/text()' passing v_xml returning content)
)
)
)
into v_json
from dual;
-- Imprime o resultado na saída padrão
dbms_output.put_line(v_json);
end;
/
O resultado é:
{"livro":{"titulo":"O Guia do Mochileiro das Galáxias","autor":"Douglas Adams","ano":"1979"}}
Essa função tem a vantagem de ser mais simples e flexível do que a função json_object, pois você não precisa usar as funções xmltable e xmlquery para extrair os dados do XML. Você pode usar a função json_object diretamente com um XMLType como parâmetro. Além disso, você pode usar a função json_serialize para formatar o JSON de acordo com as suas preferências, como usar aspas duplas ou simples, indentar ou não, etc.
No entanto, essa função também tem algumas desvantagens. Primeiro, você precisa ter a versão 19c ou superior do Oracle Database, o que pode não ser o caso de todos os usuários. Segundo, você pode ter problemas de performance, pois a função json_serialize pode consumir mais recursos do que a função json_object. Terceiro, você pode ter problemas de precisão, pois a função json_serialize pode perder ou alterar alguns dados do XML original, dependendo do tipo de dados e do formato do JSON.
Usando a função JSON_MERGEPATCH
A função JSON_MERGEPATCH é uma função SQL que permite atualizar partes de um documento JSON em operações de seleção e atualização. Você pode usar essa função para converter um XML para JSON de forma incremental, adicionando ou modificando os pares chave-valor conforme necessário. Veja um exemplo de uso:
declare
v_xml xmltype;
v_json clob;
begin
-- Cria um XMLType a partir de uma string
v_xml := xmltype('<livro><titulo>O Guia do Mochileiro das Galáxias</titulo><autor>Douglas Adams</autor><ano>1979</ano></livro>');
-- Cria um CLOB vazio
v_json := empty_clob();
-- Converte o XMLType para um CLOB usando a função json_mergepatch
select json_mergepatch(
json_mergepatch(
json_mergepatch(
v_json,
json_object('livro' value json_object())
),
json_object('livro.titulo' value xmlquery('/livro/titulo/text()' passing v_xml returning content))
),
json_object('livro.autor' value xmlquery('/livro/autor/text()' passing v_xml returning content), 'livro.ano' value xmlquery('/livro/ano/text()' passing v_xml returning content))
)
into v_json
from dual;
-- Imprime o resultado na saída padrão
dbms_output.put_line(v_json);
end;
/
O resultado é:
{"livro":{"titulo":"O Guia do Mochileiro das Galáxias","autor":"Douglas Adams","ano":"1979"}}
Essa função tem a vantagem de ser mais dinâmica e declarativa do que as outras funções, pois você pode atualizar o JSON de forma incremental, adicionando ou modificando os pares chave-valor conforme necessário. Você pode usar a notação de ponto para acessar os campos do objeto JSON. Além disso, você pode usar a função json_mergepatch para atualizar o JSON em operações de atualização, sem precisar recriar o JSON inteiro.
No entanto, essa função também tem algumas desvantagens. Primeiro, você precisa ter a versão 19c ou superior do Oracle Database, o que pode não ser o caso de todos os usuários. Segundo, você precisa escrever várias chamadas da função json_mergepatch, que podem ser repetitivas e confusas. Terceiro, você precisa conhecer bem a estrutura e o conteúdo do XML e do JSON, pois você precisa especificar os caminhos e os valores que você quer atualizar.
Conclusão
Neste artigo, vimos como converter um XML para JSON em PL/SQL usando as funções do Oracle 19c. Vimos três funções possíveis: json_object, json_serialize e json_mergepatch. Cada função tem suas vantagens e desvantagens.
Caso queira ter acesso a outras maneiras de se converter os arquivos XML, CLIQUE AQUI e veja o meu artigo anterior.
Valeuuuuu !
Referências