JSON a XML

Convierte JSON en XML bien formado desde tu navegador. Elige el nombre del elemento raiz, incluye u omite la declaracion XML y selecciona 2 espacios, 4 espacios o sin sangria.

Proyecta un arbol JSON sobre elementos, con seguridad. Pega JSON y obten XML bien formado. Los arrays se convierten en elementos repetidos, los nombres de clave invalidos se corrigen a nombres de elemento legales, y la declaracion y la sangria las decides tu.

Salida XML

Proyectar JSON sobre XML sin volverse loco

Los dos modelos no encajan

JSON tiene seis tipos de valor —objeto, array, cadena, numero, booleano y null— y todos son autodescriptivos. XML tiene exactamente un primitivo: texto. Todo lo demas es estructura construida con elementos y atributos. No existe una correspondencia oficial entre ambos, y por eso cada conversor que encuentras se comporta de forma algo distinta.

La convencion usada aqui es la mas comun y la mas predecible. Un objeto se convierte en un elemento cuyos hijos son sus claves. Una cadena, un numero o un booleano se convierten en un elemento que contiene su forma textual. null se convierte en un elemento vacio. Quedan los arrays, que no tienen contrapartida en XML: la solucion estandar es repetir el elemento padre una vez por item, de modo que {"item": [1, 2]} se convierte en <item>1</item><item>2</item> en lugar de inventar un envoltorio que el esquema receptor no espera.

No toda clave JSON es un nombre de elemento legal

Los nombres de elemento XML siguen la produccion NCName: empiezan por letra o guion bajo y despues admiten letras, digitos, guiones, puntos y guiones bajos. Sin espacios, sin barras, sin digito inicial y sin nada que empiece por las letras xml en cualquier combinacion de mayusculas, prefijo que la especificacion reserva.

Las claves JSON no tienen esa restriccion: son cadenas arbitrarias, y los payloads reales estan llenos de "user name", "2024" y "@type". Emitirlas tal cual produce un documento que ningun parser aceptara. Por eso los caracteres invalidos se sustituyen por guiones bajos y se antepone uno cuando el nombre empieza por digito. Es un paso con perdida, asi que si los nombres importan aguas abajo, renombra las claves en el JSON en vez de dejar que el conversor adivine.

Declaracion, sangria y que es seguro cambiar

La declaracion <?xml ... ?> es opcional en documentos UTF-8; los parsers asumen UTF-8 cuando falta. Inclúyela cuando el archivo se guarde en disco, se sirva por HTTP o vaya a una tuberia empresarial estricta, y omitela cuando el fragmento se incruste dentro de un documento mayor, donde una segunda declaracion es un error fatal.

La sangria es la eleccion mas sutil. A diferencia de JSON, el espacio en blanco dentro de un elemento XML forma parte del contenido, asi que embellecer cambia tecnicamente el documento: un elemento que contenia Ada ahora contiene un salto de linea, varios espacios, Ada, otro salto y mas espacios. La mayoria de esquemas lo ignoran, pero la verificacion de firmas, las secciones xml:space="preserve" y los formatos sensibles al espacio no. Usa sangria mientras lees y cambia a salida minificada para lo que vaya a consumir una maquina.

Nota de codigo abierto: implementado en JavaScript puro sin librerias de terceros.

Preguntas frecuentes

Se sube mi JSON a algun sitio?
No. El documento se analiza y se serializa integramente en tu navegador con las funciones JSON nativas, por lo que nada se envia a un servidor.
Como se representan los arrays JSON?
Repitiendo el elemento padre una vez por item. {"item": [1, 2]} pasa a <item>1</item><item>2</item>, la convencion que espera la mayoria de esquemas.
Que ocurre con claves que no son nombres de elemento validos?
Los caracteres ilegales pasan a guiones bajos y se antepone uno si el nombre empieza por digito. Renombra las claves antes si los nombres exactos importan.
Por que falta la declaracion XML en mi salida?
Es opcional y la controla una casilla. Sin ella los parsers asumen UTF-8, y debe omitirse cuando la salida se incrusta dentro de otro documento.
Los valores se escriben como atributos?
No. Todo valor se convierte en texto de elemento. Los atributos no pueden inferirse de JSON plano: haria falta un esquema del que esta herramienta no dispone.
La sangria cambia el significado del documento?
Tecnicamente si, porque el espacio dentro de un elemento es contenido. Casi todos los esquemas lo ignoran, pero usa salida minificada para XML firmado.