Pular para o conteúdo principal

Converter JSON em XML

JSON para XML converte um documento no seu navegador. Membros cujo nome começa com o prefixo de atributo viram atributos XML, um array repete o nome do próprio membro em vez de ganhar um elemento contêiner, e uma chave de JSON que não é um nome XML válido é reescrita com a original preservada em um atributo name, em vez de ser corrompida em silêncio.

Só local
Recuo
JSON
0 B1 linhaLin. 1, Col. 1
XMLsomente leitura
0 B1 linha

Como funciona o Converter JSON em XML?

A direção difícil geralmente é XML para JSON, porque XML tem mais estrutura. Fazer o caminho contrário envolve menos decisões, mas três delas são estruturais, e errar qualquer uma produz uma saída que não é XML bem formado de jeito nenhum.

Chaves de JSON não são nomes XML

Uma chave de JSON pode ser qualquer coisa: 2024 total, user.name, "", um emoji. Um nome de elemento XML não pode começar com dígito, não pode conter espaço e não pode ser vazio. A resposta usual é substituir por underscores, o que destrói a chave em silêncio. Aqui o nome é reparado da mesma forma, e a original é escrita em um atributo name — assim o documento fica bem formado e nada se perde. A quantidade de chaves reparadas é reportada em vez de ficar enterrada.

Uma raiz array produziria dois elementos raiz

Um documento XML tem exatamente um elemento raiz; isso não é uma regra de estilo, é o que faz de um documento um documento. Escrever os itens de um array de JSON de nível superior no nível superior produz tantas raízes quantos forem os itens, e todo parser de XML rejeita isso. Por isso uma raiz array é embrulhada, e seus itens assumem o nome de item.

Um array que é um membro é diferente: ele repete o próprio nome de elemento do membro, porque é assim que XML expressa uma lista. Não há elemento contêiner a menos que o JSON o tivesse, e é isso que faz a saída voltar intacta pelo conversor de XML para JSON, com o mesmo elemento em uma lista force-array.

O escape não é opcional

&, < e > em texto, além de " e quebras de linha literais em valores de atributo, precisam todos ser escapados, ou a saída fica malformada. A quebra de linha dentro de um atributo é a que as pessoas esquecem: parsers de XML a normalizam para um espaço, a menos que ela seja escrita como &#10;, então o valor muda em silêncio na volta.

XML é maior, e essa é a troca

Todo nome de elemento é escrito duas vezes. A diferença de tamanho é reportada na faixa de estatísticas para que o custo fique visível. O que isso compra são atributos, namespaces, comentários, instruções de processamento e validação contra schema — nada disso existe em JSON, e qualquer um deles pode ser o motivo de você estar convertendo.

JSON

{
  "@id": "1",
  "line": ["a", "b"],
  "note": null
}

XML

<?xml version="1.0" encoding="UTF-8"?>
<root id="1">
  <line>a</line>
  <line>b</line>
  <note/>
</root>

Quais opções e casos-limite o Converter JSON em XML suporta?

Referência técnica e opções
ParâmetroTipoPadrãoComportamento e casos-limite
Nome da raiznome de elementorootO único elemento de envoltório. Obrigatório, porque um documento XML tem exatamente um root e o nível superior do JSON não fornece um nome.
Prefixo de atributostring@Membros que começam com este prefixo tornam-se atributos. Corresponde ao padrão do conversor de XML para JSON, para que um documento sobreviva a uma ida e volta por ambos.
Chave de textostring#textO membro escrito como conteúdo do elemento em vez de um elemento filho. É assim que um elemento obtém atributos e texto.
Nome do itemnome de elementoitemNome do elemento para os itens de um array de nível superior, que não tem um nome de membro para usar. Arrays que são membros repetem o nome do membro.
Indentaçãoespaços2Zero emite uma linha única, que é o que você quer na transmissão — espaços em branco entre elementos são significativos para um parser rigoroso e a formatação altera o documento.
DeclaraçãobooleanoonEmite <?xml version="1.0" encoding="UTF-8"?>. Desligue quando a saída for um fragmento sendo incorporado em um documento maior.
Auto-fechar vaziosbooleanoonnull e objetos vazios tornam-se <a/> em vez de <a></a>. Os dois são idênticos para qualquer parser XML; algumas ferramentas downstream são mais rigorosas que a especificação.
Chave inválidareparadooriginal mantidoUma chave que não pode ser um nome de elemento é reescrita e a original é escrita em um atributo de nome. O número reparado é reportado acima da saída.
Escapeautomático—& < > em texto; & < > " e novas linhas em valores de atributo. Uma nova linha não escapada em um atributo é normalizada para um espaço pelo leitor, o que altera o valor.

Perguntas frequentes

Como faço para obter atributos em vez de elementos filhos?

Prefixe o nome do membro com @ — {"@id": "1"} vira id="1" no elemento. O prefixo é configurável, e é o mesmo padrão que o conversor de XML para JSON usa, então um documento pode ir de XML → JSON → XML e voltar com o mesmo formato.

Por que minha chave foi renomeada?

Porque ela não é um nome de elemento XML válido: começava com dígito, continha um espaço ou um caractere que o XML não permite, ou estava vazia. O nome do elemento é reparado e a chave original é escrita em um atributo name, então nada se perde e o documento fica bem formado. A quantidade é mostrada acima da saída para você saber que isso aconteceu.

Por que não há um elemento contêiner em volta do meu array?

Porque XML expressa uma lista repetindo o elemento, e não embrulhando-o. {"line": ["a","b"]} vira dois elementos <line> , o que é XML idiomático e o que sobrevive intacto à ida e volta. Se você quer <lines><line>…</line></lines>, coloque esse aninhamento no JSON: {"lines": {"line": ["a","b"]}}.

Devo indentar a saída?

Não, para qualquer coisa que vá pela rede. Espaço em branco entre elementos é significativo em XML — um parser estrito enxerga a sua indentação como nós de texto, e para conteúdo misto isso realmente muda o documento. Indente para leitura, zere o indent para envio. Esta é uma diferença real do JSON, onde espaço em branco nunca importa.

Ele consegue produzir um documento que valide contra o meu XSD?

Só por coincidência. Um schema restringe a ordem dos elementos, a cardinalidade, os tipos de dados e os namespaces, e nenhuma dessas informações existe em JSON — os membros de um objeto não têm ordem significativa, então o conversor não pode saber qual sequência o seu schema exige. Use isto para obter o formato, depois reordene e adicione namespaces para casar com o schema.

Meu JSON é enviado?

Não. O parse e a conversão rodam na aba que você já tem aberta, o que você pode confirmar no painel Network. O motivo usual para converter JSON em XML é alimentar um sistema corporativo mais antigo, e os payloads envolvidos raramente são do tipo que você gostaria que passasse por um servidor desconhecido.