Português (Brasil)

Ferramentas de desenvolvedor · Conversores de sintaxe

Conversão de JSON para XML: elementos raiz, matrizes e nomes de tags inválidos

· Como funciona

JSON xml formatos de dados

Uma matriz JSON sem raiz entrando em um wrapper XML com itens filhos repetidos
Ilustração vetorial original ToolAcre

JSON pode ser uma matriz simples com chaves que começam com dígitos ou contêm espaços, nenhum dos quais XML permite. Este post explica as decisões que um conversor deve tomar sobre raízes, arrays e nomes, para que você possa prever a saída.

A matriz sem nome — uma matriz JSON de nível superior que deve se tornar um documento XML de raiz única e o elemento wrapper que aparece

JSON pode começar com `[1,2]`; XML não pode começar com dois elementos de documento peer. ToolAcre portanto agrupa uma matriz raiz no nome raiz selecionado e grava cada membro como um filho `<item>` repetido. O aviso nomeia essa convenção, porque os nomes do wrapper e dos itens não estavam presentes na origem.

Escolher `numbers` produz um elemento de documento `<numbers>` contendo dois elementos de item. A conversão é determinística, mas não canônica: outro sistema pode exigir `<number>` ou uma coleção com atributos. Defina a raiz deliberadamente e compare o resultado com o contrato XML exigido pelo receptor.

XML precisa de exatamente uma raiz — por que cada conversão inventa ou pede um nome de elemento raiz

Um documento XML deve ter exatamente um elemento raiz. Um objeto JSON com exatamente uma chave comum de nível superior pode usar essa chave diretamente. Um objeto multichave, array, escalar ou nulo não possui um único nome fornecido, portanto, o gravador o inclui em `root`, a menos que o usuário forneça outro nome legal.

A regra wrapper é implementada antes da serialização e aparece como um aviso. Não é descoberto por um esquema e não afirma que `<root>` tenha significado para o serviço legado. Nomear o envelope faz parte do projeto de integração, enquanto o conversor apenas garante uma estrutura bem formada sob seu próprio mapeamento.

Matrizes não têm equivalente XML — repetindo um elemento por item e como matrizes de escalares e matrizes de matrizes são representadas

Matrizes tornam-se elementos repetidos. Na raiz do documento, os membros usam `<item>` abaixo do wrapper. Dentro de um objeto, uma matriz armazenada em `line` torna-se irmãos `<line>` repetidos. Matrizes de objetos criam elementos repetidos com campos filhos; matrizes aninhadas não possuem nomes de domínio e herdam a estrutura genérica produzida pelo construtor.

Isso perde a distinção entre um membro da matriz e um escalar com o mesmo nome de elemento após uma leitura XML-to-JSON posterior. XML fornece ocorrências, não um marcador de array independente. Se a cardinalidade estável for importante, um esquema ou mapeamento de aplicativo deverá fornecê-la; um serializador genérico não pode provar isso apenas com nomes de elementos em formato JSON.

Chaves que não podem ser nomes de elementos — nomes que começam com um dígito, contêm espaços ou pontuação ou começam com 'xml' e como os conversores os renomeiam ou escapam deles

Os conversores sugeridos podem renomear ou escapar de chaves ilegais. ToolAcre os recusa explicitamente. Uma chave com um espaço, uma que comece com um dígito ou hífen ou uma que comece com as letras reservadas `xml` aciona `UNSUPPORTED_SHAPE` e nomeia o caminho incorreto. A renomeação silenciosa produziria XML que não corresponde a nenhum esquema acordado.

Os nomes válidos podem começar com uma letra, sublinhado ou prefixo no estilo namespace e podem conter dígitos, pontos, sublinhados, dois pontos e hífens após o início. As chaves de atributos usam `@` apenas como a convenção JSON; o nome do atributo restante deve passar na mesma verificação. Renomeie a chave de origem intencionalmente ou escolha outro formato de destino.

Chaves que não podem ser nomes de elementos são recusadas, nunca renomeadas ou escapadas

Números e booleanos são serializados como elemento de texto, portanto seu tipo JSON não é mais declarado por XML. O leitor reverso padrão, consequentemente, retorna strings. Null não tem representação XML aqui: ele se torna um elemento vazio, indistinguível de uma string vazia, e o escritor relata quantos valores sofreram essa alteração.

Isso significa que `{ "a": null, "b": "" }` pode produzir dois elementos vazios que são lidos de forma semelhante. Chamar essa viagem de ida e volta de sem perdas seria falso. Os atributos `#text` e `#cdata` preservam a convenção estrutural do conversor, mas não adicionam um sistema geral de tipos XML.

Os tipos tornam-se texto XML, enquanto null se torna uma ambiguidade admitida de elemento vazio

Use `{"order":{"@id":"A-7","customer":"Ada","line":[{"sku":"P1","qty":2},{"sku":"P2","qty":1}],"note":null}}`. A única chave `order` torna-se a raiz, `@id` torna-se um atributo, cada objeto de linha torna-se um `<line>` repetido e nulo torna-se um `<note></note>` vazio com um aviso.

Leia a saída com a inferência desabilitada. Os valores de id do atributo, quantidade e texto são strings e a linha é uma matriz porque aparece duas vezes. Isso demonstra o inverso exato suportado ao expor os tipos nulos e numéricos perdidos. Um esquema de ordem de recebimento pode exigir outros nomes ou ordens, o que este exemplo não valida.

O que isso não cobre - produzir XML que corresponda a um determinado XSD ou namespace, que precisa de um mapeamento escrito à mão

O gravador não consome um XSD, atribui URIs de namespace ou decide a ordem dos elementos de um esquema de negócios. Ele escreve uma declaração XML e nunca emite uma DOCTYPE. As chaves que contêm prefixos de namespace são preservadas literalmente, mas isso não é uma resolução de namespace ou uma prova de que o prefixo foi declarado corretamente.

A geração de XML aceita por um serviço específico pode exigir atributos, restrições de sequência, grupos de escolha e nomes qualificados. Use seu esquema ou documentação atual para construir esse mapeamento. Uma conversão genérica é adequada para inspeção e documentos simples centrados em dados, e não um substituto para serialização com reconhecimento de contrato.

Conclusão: preveja a forma antes de depender dela - e como o painel Conversores de sintaxe mostra a estrutura XML que um documento JSON produz

Preveja o envelope, os nomes dos itens e digite a perda antes, dependendo do resultado. ToolAcre agrupa valores sem uma raiz, repete arrays, mapeia chaves `@` para atributos, substitui nulo por texto vazio e recusa nomes ilegais em vez de adivinhar substituições. Cada mudança não óbvia aparece na saída ou nos avisos.

Teste o menor objeto que inclui uma matriz de nível superior, registros repetidos, nulo, texto numérico e uma chave estranha. Uma recusa é uma prova útil de que o mapeamento manual é necessário. Um arquivo bem-sucedido ainda precisa de validação pelo receptor real, porque XML bem formado e XML válido para esquema são declarações diferentes.

Depois que o receptor aceitar uma amostra, adicione uma inspeção reversa apenas onde se espera que o mapeamento sobreviva. Atributos e filhos repetidos podem fazer ida e volta sob a própria convenção de ToolAcre, enquanto tipos nulos e escalares não podem. Registrar essa distinção evita que um exemplo de caminho feliz bem-sucedido seja generalizado para todos os documentos de pedido que sua integração possa produzir.