Pular para o conteúdo

Como converter um XML para JSON em PL/SQL – Para quem ainda está preso no 12c

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 parsestringifygetput, 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 xmltypexmlsequenceextractjson_object_tjson_array_tputappend, 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

Natanael Freitas

Natanael Freitas

E aí, pessoal! Sou o Natanael Freitas, o cara que curte desbravar o mundo do PL/SQL. Não sou nenhum expert, mas me viro bem nas linhas de código desse universo. A verdade é que sou mais íntimo de bancos de dados do que de muitas pessoas por aí – sério! Quando não tô quebrando a cabeça com triggers e stored procedures, tô por aí fuçando a web em busca de tudo que é novidade nesse mundão tech. Às vezes, me pego dando uma aula rápida sobre PL/SQL pros colegas, na tentativa de descomplicar essa coisa toda. Meu dia a dia é basicamente sorrisos, café (sim, sou desses que não larga a caneca!) e resolvendo problemas nos códigos. Não sou nenhum Picasso, mas acho que consigo fazer umas artes por aí. Então, se precisar de ajuda com PL/SQL ou só quiser bater um papo sobre o assunto, tamo aí!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

plugins premium WordPress