Os dois modelos não se alinham: RFC 8259 define seis tipos JSON sem atributos, enquanto XML 1.0 possui atributos, namespaces e conteúdo misto ordenado Ir nessa direção significa escolher o que fazer com a diferença.
A primeira vez que tive de enviar dados JSON para um sistema que só falava XML, fiz a coisa ingénua: escrevi à mão os parênteses angulares num editor de texto Era um feed de fornecedor que esperava um envelope SOAP-ish, e a minha fonte era um array JSON arrumado a sair de uma API Laravel Vinte minutos depois, tinha desfasado uma marca de fecho algures em torno do quadragésimo registo e o analisador receptor atirou um & quot; lixo atrás do elemento e quot do documento; erro que não me disse nada sobre onde. Naquela noite me ensinou uma lição que apliquei em todas as integrações desde: converter entre JSON e XML não é um ato criativo É um problema de mapeamento com um pequeno número de regras, e no momento em que você escreve essas regras, a coisa toda se torna mecânica.
Este guia é a versão desse mapeamento que desejo que I'd tivesse. Eu construo [Toolz.dev](/, e uma das ferramentas lá é baseada em navegador Conversor JSON para XML isso aplica exatamente as convenções abaixo Mas o ponto deste artigo não é o botão - it's compreensão por que uma chave torna-se um elemento, por que um @- a chave prefixada torna - se um atributo, e porque é que uma matriz se transforma em marcas repetidas em vez de uma lista numerada, Assim que essas três ideias clicarem, poderá converter qualquer JSON em XML à mão, se tiver de o fazer, e poderá depurar a saída quando um sistema a jusante a rejeitar.
tl;dr: Para converter JSON em XML, mapeie cada chave de objeto para um elemento, cada um
@-chave prefixada para um atributo em seu elemento pai e o#textchave para o conteúdo do texto do elemento & #39; S. Expanda cada matriz em elementos irmãos repetidos que compartilham a chave & #39; s name. Escape&,<, e>em texto (mais"em valores de atributos), e higienizar qualquer chave que seja & #39; t um nome XML legal Faça isso no navegador para que cargas úteis com tokens ou dados de clientes nunca saiam da sua máquina.
Por que você converteria JSON em XML em primeiro lugar?
JSON ganhou a guerra API web anos atrás, e se você passar seus dias em React, Laravel, ou Node, você pode razoavelmente perguntar quando você' nunca precisa XML em tudo A resposta é: constantemente, apenas não nos lugares que você olha XML é a língua franca de uma enorme base instalada de sistemas que antecedem a era JSON e não estão indo a lugar nenhum SOAP web services - ainda a espinha dorsal de bancos, seguros, logística, e integrações governamentais - carregam suas cargas em XML RSS e Atom feeds são XML. Sitemaps são XML. Layouts Android, .docx e .xlsx internos (Office Open XML), SVG, feeds de podcast RSS e inúmeras trocas no estilo B2 B EDI são todas XML.
Portanto, o cenário do mundo real tem quase sempre a mesma forma: você tem dados para JSON porque isso' é o que sua pilha produz e você precisa disso para XML porque isso' s o que o outro lado exige Talvez você're empurrando dados do produto em um mercado que só aceita um feed XML. Talvez você're envolvendo uma resposta API em um corpo SOAP Talvez você're gerando um feed RSS de uma exportação de conteúdo JSON Em todos os casos, você don' t quer reinventar a serialização cada vez - você quer uma regra previsível que transforma qualquer estrutura JSON em XML válido, para que você possa automatizá-lo e parar de pensar sobre ele.
There' s também uma razão mais silenciosa: legibilidade durante a depuração Quando você're olhando para um blob JSON profundamente aninhado tentando entender uma hierarquia, convertendo-o em XML recuado às vezes faz a estrutura da árvore saltar para fora, porque XML' s tags de abrir/fechar tornam o aninhamento explícito de uma forma que os aparelhos JSON' s don't. Eu mantenho o Conversor JSON para XML e o inverso Conversor de XML para JSON abra em guias adjacentes com mais frequência do que I' eu adivinhei.
Como o JSON mapeia para XML, exatamente?
Aqui está o núcleo disso Existem apenas quatro regras, e todo o resto é um detalhe.
Regra 1: As chaves de objeto tornam-se elementos. Um objeto JSON { "book": { "title": "..." } } torna-se <book><title>...</title></book>. A chave é o nome da tag; o valor é o que entra.
Regra 2: @-as chaves prefixadas tornam-se atributos. Os elementos XML podem transportar atributos, e JSON não tem nenhum conceito nativo deles, então precisamos de uma convenção O amplamente utilizado - e o que minha ferramenta usa - é um caractere de prefixo, @ por omissão. Então { "book": { "@id": "bk101", "title": "..." } } torna-se <book id="bk101"><title>...</title></book>. Os atributos só podem conter valores primitivos (cordas, números, booleanos), estruturas nunca aninhadas, o que corresponde à forma como os atributos XML realmente funcionam.
Regra 3: O #text chave torna-se conteúdo de texto. Quando um elemento precisa ambos atributos e texto - pense <title lang="en">Hello</title> - você pode & #39; t expressar isso com um valor de string simples, porque a string não deixa espaço para o atributo A convenção é uma chave reservada, #text: { "title": { "@lang": "en", "#text": "Hello" } }. Se um elemento tiver apenas texto e nenhum atributo, você poderá pular #text e basta usar um valor de string simples.
Regra 4: Matrizes tornam-se elementos repetidos. Este é o que as pessoas erram com mais frequência XML não tem tipo de matriz Uma lista de coisas é expressa como elementos irmãos repetidos com o mesmo nome de tag. Então { "tags": { "tag": ["computer", "web"] } } torna-se <tags><tag>computer</tag><tag>web</tag></tags> - não <tag>0</tag> ou qualquer absurdo baseado em índice. A matriz's chave fornece o nome da tag repetida.
Junte-os em um objeto realista e a saída é exatamente o que um analisador XML downstream espera:
{
"catalog": {
"book": [
{ "@id": "bk101", "author": "Gambardella, Matthew", "price": 44.95 },
{ "@id": "bk102", "author": "Ralls, Kim", "price": 5.95 }
]
}
}
torna-se
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<book id="bk101">
<author>Gambardella, Matthew</author>
<price>44.95</price>
</book>
<book id="bk102">
<author>Ralls, Kim</author>
<price>5.95</price>
</book>
</catalog>
Observe que a única chave de nível superior, catalog, tornou-se o elemento raiz do document' s. That' s deliberate: um documento XML bem formado deve ter exatamente uma raiz Quando seu JSON já possui uma única chave de embalagem, essa chave é a raiz. Quando isso acontece & #39; t - quando você entrega ao conversor um objeto multi-chave ou uma matriz simples - a ferramenta envolve tudo sob um elemento raiz configurável (root por padrão) para que a saída permaneça bem formada.
E quanto a fugir e nomes inválidos?
Duas coisas quebram silenciosamente mais conversões do que qualquer bug de aninhamento: caracteres especiais não escapados e nomes de elementos ilegais.
Escapando. XML reserva um punhado de caracteres Dentro do texto do elemento, &, <, e > deve ser escrito como &, <, e >. Dentro de um valor de atributo citado duas vezes, você também precisa escapar da aspa dupla como ". Se a sua string JSON contiver Tom & Jerry e você soltá-lo em XML cru, o ampersand nu faz o documento malformado e o analisador morre Um conversor correto escapa automaticamente, então "a < b & c" torna-se a < b & c na saída e ida e volta de volta ao texto original quando analisado Isso não é polimento opcional - it' s a diferença entre XML válido e inválido.
Nomes elementos. XML tem regras rígidas sobre o que um nome de tag pode conter Os nomes podem & #39; t incluir espaços, can & #39; t começar com um dígito, um hífen ou um ponto final, e excluir a maioria das pontuações JSON não têm tais restrições - "first name", "123", e "total($)" são todas chaves JSON perfeitamente legais e todos os nomes XML ilegais Um conversor que ignora isso produz documentos que nenhum analisador aceitará A correção pragmática, e o que minha ferramenta faz, é higienizar: substituir caracteres ilegais por sublinhados e anexar um sublinhado quando um nome começa com um dígito Então "123 bad" torna-se <_123_bad>. It' não é glamoroso, mas garante as análises de saída, que é o ponto inteiro.
Como uso o conversor baseado em navegador?
O fluxo de trabalho ligado Toolz.dev/ferramentas/json-to-xml reflete as regras acima, com algumas opções para os casos práticos de borda.
Cole seu JSON na entrada e pressione Convert. Se o seu JSON estiver malformado, você receberá um erro de análise claro em vez de lixo silencioso - eu me apoio no navegador & #39; próprio JSON.parse, para que as mensagens de erro correspondam ao que você & #39; d ver na sua consola Escolha 2 ou 4 espaços de indentação quando quiser um documento legível por humanos para revisão, ou escolha Minify para colapsar a coisa toda numa única linha quando você & #39; estiver a enviá - lo por cima do fio e cada contagem de bytes (pedidos SOAP e cargas úteis de alimentação especialmente).Definir o nome do elemento raiz para o caso em que o seu JSON não tem uma única chave de envolvimento Alternar a declaração XML (Toggle the XML declaration)<?xml version="1.0" encoding="UTF-8"?>) ligado ou desligado dependendo se o consumidor espera um prólogo E decidir se os nós vazios devem se fechar como <tag/> ou expandir para <tag></tag> - alguns consumidores rigorosos se importam.
Tudo corre no lado do cliente O conversor é um serializador livre de dependência escrito em TypeScript, não um wrapper em torno de uma API remota Isso importa mais do que parece: as respostas da API e os arquivos de configuração contêm rotineiramente tokens de acesso, registros de clientes e identificadores internos, e um & quot; conversor & quot online gratuito; que POSTA sua carga útil para alguém & #39; s servidor é um vazamento de dados esperando para acontecer Como este nunca faz uma chamada de rede, você pode converter dados confidenciais com segurança, e ele continua trabalhando sem conexão alguma Se a privacidade nas ferramentas do navegador é algo que você pensa - e se você lida com outras pessoas & #39; s dados, deve ser - EU escrevi mais sobre isso no Guia de ferramentas de privacidade de dados.
JSON vs XML: uma comparação rápida
Ajuda a manter os dois formatos' compensações em vista, porque o razão o mapeamento precisa de convenções como @ e #text é que o XML pode expressar coisas que o JSON pode e #39; t e vice-versa.
| Aspecto | JSON | xml |
|---|---|---|
| atributos | Sem conceito nativo | Primeira classe (<tag attr="v">) |
| Matrizes/listas | Nativo [ ] escrever à tipologia |
Elementos irmãos repetidos |
| comentários | Não permitido | <!-- ... --> apoiado |
| namespaces | nenhum | Suporte completo ao namespace |
| Conteúdo misto (texto + elementos) | Incrível | Nativo |
| Esquema/validação | Esquema JSON (complemento) | XSD, DTD, RELAX NG (maduro) |
| verbosidade | Compacto | Mais prolixo (fechando tags) |
| Uso típico hoje | APIs da Web, configuração | SABÃO, feeds, documentos, empreendimento |
o @ existe um prefixo para unir o & quot; atributos" linha; a regra da etiqueta repetida une o & quot; matrizes" linha; e #text faz a ponte entre o & quot; conteúdo misto" linha Uma vez que você vê o mapeamento como uma ponte sobre essas lacunas específicas, ele deixa de parecer arbitrário.
JSON para XML ida e volta de forma limpa?
Principalmente, sim - e isso' por design. Meu json para xml e xml para json as ferramentas compartilham o mesmo @ prefixo de atributo e #text tecla de conteúdo, então a conversão de XML → JSON e vice-versa geralmente reproduz o documento original Se você & #39; está construindo um pipeline que tem que mover dados em ambas as direções, vale a pena confiar nessa simetria.
Onde o round-tripping fica difuso é o mesmo lugar onde todo mapeamento JSON/XML fica difuso: ordem e conteúdo misto Os objetos JSON são oficialmente desordenados, portanto, um conversor pode não preservar a ordem exata de irmãos dos elementos de nome diferente XML que intercala texto e elementos filhos (<p>Hello <b>world</b>!</p>) does't tem uma representação JSON limpa e volta como uma aproximação E um elemento que às vezes aparece uma vez e às vezes aparece várias vezes é ambíguo - é um único valor ou uma matriz de um? estes são & #39; t bugs em qualquer ferramenta particular; they' são inerentes ao fato de que os dois modelos de dados don' t perfeitamente se sobrepõem Saber onde as costuras são permite projetar seu JSON para que a conversão permaneça sem perdas: seja consistente sobre se uma coisa é sempre uma matriz e evite conteúdo misto onde puder.
Se você trabalha muito com JSON, vale a pena construir fluência em toda a família de conversões - coletei aquelas que mais alcancei no Guia definitivo para ferramentas JSON, e o mais amplo Guia de ferramentas de codificação abrange onde os conversores de formato se encaixam em um fluxo de trabalho do dia-a-dia Para a direção inversa e formatos adjacentes, o Conversor JSON para YAML e uma planície formatador json arredonde o set.
Erros comuns ao converter JSON para XML
Algumas armadilhas I'atingiu ou assistiu outros atingirem:
Tratando índices de array como nomes de tags. Se você vê <item0>, <item1> na saída de alguém & #39; s, eles construíram o conversor errado Matrizes se tornam repetido tags com o mesmo nome, retirado da chave array's.
Esquecer que só pode haver uma raiz. Entregar um objeto multi-chave direto para um serializador sem embrulhá-lo produz vários elementos de nível superior, o que não é um documento bem formado Embrulhe-o.
Ignorando o escape do & quot; porque os dados parecem limpos." Parece limpo até que uma descrição do produto contenha um e comercial ou um <. Sempre escapar; nunca assuma.
Colocando dados estruturados em atributos. Os atributos contêm primitivas. Se você tentar enfiar um objeto aninhado em um @-chave prefixada, um conversor correcto irá (e deverá) largá - la ou ignorá - la, porque lá & #39; s nenhum XML válido para ela Em vez disso, modele - a como um elemento filho.
Avançado: escolhendo indentação e declaração para o consumidor
Um hábito que me salvou repetidas idas e vindas com parceiros de integração: corresponder ao resultado exatamente para o que o consumidor espera, então pare Alguns endpoints SOAP rejeitam um documento que inclui uma marca de ordem de bytes ou um prólogo inesperado; outros exigem o <?xml ... ?> declaração e 415 você sem ele Alguns validadores de feed querem XML bastante impresso e recuado para sua própria depuração; a maioria dos transportes de produção quer que seja minificado Em vez de argumentar, gero qualquer variante que a especificação peça. Isso e no 39; é por isso que o conversor expõe o recuo (incluindo uma opção minify), a alternância de declaração e o comportamento de fechamento automático como controles de primeira classe - eles e no 39; não são decoração, eles e no 39; são os botões que determinam se um consumidor exigente aceita seu documento na primeira tentativa.
FAQ
Como faço para converter JSON em XML?
Cole seu JSON no editor e pressione Convert. As teclas de objeto tornam-se elementos XML, as matrizes tornam-se tags repetidas e o resultado parece pronto para copiar ou baixar Não há upload - a conversão acontece no seu navegador.
Como os atributos JSON são representados em XML?
Por convenção, qualquer chave de objecto que comece com o & quot;@" prefixo é escrito como um atributo em seu elemento pai e não como um elemento filho. Por exemplo, {"book": {"@id": "bk101", "title": "..."}} se torna
Como o conversor lida com arrays JSON?
Cada elemento de uma matriz é emitido como um elemento irmão repetido compartilhando a chave & #39; s name. Então {" tags": {"tag": ["a", "b"]}} produz
Para que serve a chave de #texto?
Quando um elemento necessita de atributos e conteúdo de texto, o texto é armazenado sob o & quot;#texto" chave. {"título": {"@lang": "en", "#texto": "Olá"}} se torna
Posso obter XML reduzido em vez de uma saída recuada?
Sim. Defina o recuo como 0 (minify) e o conversor emite o documento inteiro em uma única linha sem espaços em branco entre as tags. Isso é útil para solicitações SOAP ou feeds em que o tamanho da carga útil é importante; volte para 2 ou 4 espaços quando precisar de um documento legível.
O que acontece com as chaves que não são nomes de elementos XML válidos?
Os nomes dos elementos XML não podem conter espaços, não podem começar com um dígito, hífen ou ponto final e excluir a maioria das pontuações As chaves que violam essas regras são higienizadas - caracteres inválidos tornam-se sublinhados e um sublinhado inicial é adicionado quando necessário - portanto, a saída sempre analisa, mesmo que suas chaves JSON não sejam amigáveis ao XML.
O JSON para XML faz round-trip com a ferramenta XML para JSON?
Para as estruturas comuns que ele faz Esta ferramenta e a ferramenta XML para JSON partilham o mesmo & quot;@" prefixo de atributo e & quot; #text" tecla de conteúdo, portanto, converter XML para JSON e vice-versa geralmente reproduz o mesmo documento Detalhes independentes de pedido e conteúdo misto são as fontes usuais de pequenas diferenças, como acontece com qualquer mapeamento XML/JSON.
É seguro converter JSON sensível aqui?
Sim. O conversor é JavaScript simples que é executado inteiramente em seu navegador - nada do que você colar é transmitido para um servidor, registrado ou armazenado Isso o torna seguro para respostas de API, arquivos de configuração e registros contendo tokens ou dados pessoais, e ele continua trabalhando sem conexão de rede.



