Como converter um XML para JSON em PL/SQL
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 e ainda está preso no Oracle 12c ? Então, como você pode fazer essa conversão de forma eficiente e confiável?
Existem algumas opções possíveis para converter um XML para JSON em PL/SQL. Vamos ver algumas delas e comparar seus prós e contras.
Opção 1: Usar uma biblioteca externa
Uma opção é usar uma biblioteca externa que forneça funções para converter XML para JSON. Por exemplo, você pode usar a biblioteca [pljson], que é um pacote PL/SQL que implementa o padrão JSON. Essa biblioteca tem uma função chamada xml.tojson
que recebe um XMLType como parâmetro e retorna um JSONType. Veja um exemplo de uso:
declare
v_xml xmltype;
v_json pljson.json;
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 JSONType usando a função pljson.xml.tojson
v_json := pljson.xml.tojson(v_xml);
-- Imprime o resultado na saída padrão
dbms_output.put_line(v_json.to_char());
end;
/
O resultado é:
{
"livro": {
"titulo": "O Guia do Mochileiro das Galáxias",
"autor": "Douglas Adams",
"ano": "1979"
}
}
Essa opção tem a vantagem de ser simples e fácil de usar. Você só precisa instalar a biblioteca pljson no seu banco de dados e usar a função xml.tojson
. A biblioteca também oferece outras funções para manipular JSON, como parse
, stringify
, get
, put
, etc.
No entanto, essa opção também tem algumas desvantagens. Primeiro, você precisa confiar em uma biblioteca de terceiros, que pode ter bugs, vulnerabilidades ou incompatibilidades com o seu banco de dados. Segundo, você pode ter problemas de performance, pois a conversão envolve a criação de vários objetos intermediários. Terceiro, você pode ter problemas de precisão, pois a conversão pode perder ou alterar alguns dados do XML original, dependendo da estrutura e do conteúdo do XML.
Opção 2: Usar uma função SQL
Outra opção é usar uma função SQL que faça a conversão de XML para JSON. Por exemplo, você pode usar a função json_object
, que está disponível a partir da versão 12.2 do Oracle Database. Essa função recebe uma lista de pares chave-valor e retorna um objeto JSON. 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 opçã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 opção pode ser mais rápida e precisa do que a opção anterior, pois a conversão é feita diretamente pelo banco de dados, sem a criação de objetos intermediários.
No entanto, essa opçã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.
Opção 3: Escrever uma função PL/SQL
A última opção é escrever uma função PL/SQL que faça a conversão de XML para JSON. Essa opção é a mais flexível e personalizável, pois você pode implementar a lógica da conversão da forma que você quiser. Você pode usar as funções nativas do PL/SQL para manipular XML e JSON, como xmltype
, xmlsequence
, extract
, json_object_t
, json_array_t
, put
, append
, etc. Veja um exemplo de uso:
declare
v_xml xmltype;
v_json clob;
-- Função que converte um XMLType para um CLOB contendo um JSON
function xml_to_json(p_xml xmltype) return clob is
v_json_obj json_object_t;
v_json_arr json_array_t;
v_nodes xmltype;
v_node xmltype;
v_name varchar2(100);
v_value varchar2(4000);
begin
-- Cria um objeto JSON vazio
v_json_obj := json_object_t();
-- Obtém os nós filhos do XML
v_nodes := p_xml.extract('/*/*');
-- Itera sobre os nós filhos
for i in 1 .. v_nodes.count loop
-- Obtém o nó atual
v_node := v_nodes(i);
-- Obtém o nome do nó
v_name := v_node.extract('local-name(.)').getstringval();
-- Verifica se o nó tem filhos
if v_node.existsnode('/*/*') = 1 then
-- Se sim, chama a função recursivamente para converter o nó filho para JSON
v_value := xml_to_json(v_node);
-- Adiciona o par chave-valor ao objeto JSON, usando o nome do nó como chave e o JSON do nó filho como valor
v_json_obj.put(v_name, json_object_t.parse(v_value));
else
-- Se não, obtém o valor do nó como texto
v_value := v_node.getstringval();
-- Adiciona o par chave-valor ao objeto JSON, usando o nome do nó como chave e o valor do nó como valor
v_json_obj.put(v_name, v_value);
end if;
end loop;
-- Retorna o objeto JSON como um CLOB
return v_json_obj.to_clob();
end xml_to_json;
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 xml_to_json
v_json := xml_to_json(v_xml);
-- 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 opção tem a vantagem de ser totalmente customizável, pois você pode implementar a lógica da conversão da forma que você quiser. Você pode lidar com casos especiais, como atributos, namespaces, comentários, espaços em branco, etc. Você também pode formatar o JSON de acordo com as suas preferências, como usar aspas duplas ou simples, indentar ou não, etc.
No entanto, essa opção também tem algumas desvantagens. Primeiro, você precisa escrever uma função PL/SQL complexa, que pode ser difícil de testar e depurar. Segundo, você precisa ter um bom conhecimento de PL/SQL, XML e JSON, pois você é responsável por toda a lógica da conversão. Terceiro, você pode ter problemas de performance, pois a função PL/SQL pode consumir mais recursos do que uma função SQL nativa.
Conclusão
Neste artigo, vimos como converter um XML para JSON em PL/SQL com os recursos do Oracle 12c. Vimos três opções possíveis: usar uma biblioteca externa, usar uma função SQL ou escrever uma função PL/SQL. Cada opção tem seus prós e contras, e a escolha depende dos requisitos e das preferências de cada usuário. Espero que este artigo tenha sido útil e divertido para você. Se você gostou, compartilhe com seus amigos e colegas. Se você tem alguma dúvida, sugestão ou crítica, deixe um comentário abaixo.
No próximo artigo, irei falar sobre o mesmo tema, mas utilizando as features do 19c !
Obrigado pela leitura e até a próxima! 😊
Referências
- [pljson]: Uma biblioteca PL/SQL para manipular JSON
- [json_object]: Uma função SQL para criar objetos JSON
- [xmltable]: Uma função SQL para converter XML em tabelas relacionais
- [xmlquery]: Uma função SQL para executar consultas XPath ou XQuery em XML
- [xmltype]: Um tipo de dados PL/SQL para armazenar e manipular XML
- [json_object_t]: Um tipo de dados PL/SQL para representar objetos JSON