Convertir XML a JSON
XML a JSON convierte un documento en tu navegador. No existe una correspondencia canónica entre los dos formatos, así que cada decisión es una opción y no un valor por defecto silencioso —la importante es la lista de forzar array, porque XML no distingue una lista de un solo elemento de un valor único y ningún conversor puede deducirlo—.
¿Cómo funciona Convertir XML a JSON?
XML y JSON no describen las mismas formas, así que no existe una única traducción correcta entre ellos. Un conversor que presenta una de todos modos está ocultando cuatro decisiones, cada una de las cuales puede corromper tus datos en silencio.
El problema del elemento único, que no se puede deducir
XML no tiene arrays. <line/><line/> son dos elementos; <line/> es uno. Así que un conversor convierte los elementos repetidos en un array y deja un elemento solitario como escalar —lo que significa que el mismo endpoint produce {"line": {…}} para un pedido con una línea y {"line": [{…}, {…}]} para un pedido con dos. El código escrito contra el segundo se rompe con el primero, en producción, el día que un cliente pide una sola cosa.
Esto no se resuelve por deducción. La información necesaria —¿es este elemento una colección?— vive en el esquema, no en la instancia. La solución honesta es la lista de forzar array: nombra los elementos que son colecciones y siempre serán arrays, por muchos que el documento contenga hoy por casualidad.
Los atributos necesitan a dónde ir
<line sku="X"><sku>Y</sku></line> tiene un atributo y un elemento hijo con el mismo nombre. Fusionarlos pierde uno. El prefijo —@ por defecto— conserva los dos, al precio de claves un poco incómodas de teclear en JavaScript. Ponlo vacío para fusionarlos y acepta la colisión.
XML no tiene tipos
<qty>3</qty> es la cadena "3". Forzarlo a número es una apuesta, y es la apuesta que convierte la referencia 007 en 7 y el código postal 01970 en 1970. El análisis de valores está por eso desactivado por defecto, y cuando está activo, un cero inicial sigue dejando el valor como cadena —la gramática de JSON prohíbe los ceros iniciales de todos modos, así que no hay nada que perder—.
El contenido mixto no sobrevive
<p>before<b>bold</b>after</p> tiene texto antes y después de un hijo. Los objetos JSON no tienen orden, así que los dos fragmentos de texto se unen bajo una clave y su posición respecto a <b> se pierde. Nada puede arreglar esto; el XML con forma de documento no tiene forma de datos, y convertirlo a JSON es el movimiento equivocado, no uno con pérdidas.
La entrada malformada se rechaza, no se adivina
Las etiquetas mal emparejadas y los elementos sin cerrar producen un error que nombra la etiqueta y la línea. Un conversor que acepta <a><b></a> y emite JSON de aspecto plausible es peor que uno que falla, porque quien pega XML truncado nunca se entera de que estaba truncado.
XML
<order id="1"> <line sku="A">Widget</line> </order>
JSON
{
"order": {
"@id": "1",
"line": {
"@sku": "A",
"#text": "Widget"
}
}
}
// with "line" forced: "line": [ … ]¿Qué opciones y casos límite admite Convertir XML a JSON?
| Parámetro | Tipo | Valor predeterminado | Comportamiento y casos límite |
|---|---|---|---|
| Forzar array | nombres de elementos | (ninguno) | Los nombres que figuran aquí son siempre arrays, aunque aparezcan una sola vez. La opción más importante de todas: es el único remedio para el problema de la lista de un elemento, y no se puede deducir del documento. |
| Prefijo de atributos | string | @ | Mantiene los atributos separados de los elementos hijos con el mismo nombre. Déjalo vacío para fusionarlos, asumiendo que en una colisión uno gana. |
| Clave de texto | string | #text | Dónde va el texto de un elemento cuando también tiene atributos o hijos. Un elemento con solo texto, en cambio, queda reducido a una cadena sin más. |
| Interpretar valores | booleano | desactivado | Convierte "3" en 3, "true" en true y "null" en null. Desactivado por defecto porque XML no tiene tipos y adivinar convierte números de pieza en enteros. |
| Ceros a la izquierda | se mantienen como string | siempre | 007 se queda en "007" aunque la interpretación de valores esté activada. La gramática de JSON prohíbe el cero inicial, así que no existe representación a la que convertirlo sin perderlo. |
| Quitar espacios de nombres | booleano | desactivado | Elimina los prefijos, de modo que soap:Envelope pasa a ser Envelope, y suprime las declaraciones xmlns. Cómodo para SOAP; con pérdidas si dos espacios de nombres usan el mismo nombre local. |
| Conservar comentarios | booleano | desactivado | Guarda los comentarios bajo un miembro #comment. Su posición entre elementos no se conserva, porque los objetos JSON no tienen orden. |
| Elementos vacíos | null | siempre | <a/> y <a></a> son lo mismo en XML, y ambos se convierten en null en lugar de en una cadena vacía, que daría a entender que hay un valor. |
| CDATA | texto literal | — | El contenido dentro de CDATA se toma literal: un < dentro de él es el carácter & seguido de lt, no un signo de menor que. Para eso existe CDATA. |
| Entidades | decodificadas | las cinco predefinidas | & < > " ' más las referencias numéricas. Una entidad no declarada se deja tal cual en vez de borrarse, porque borrar contenido en silencio es el fallo peor. |
Preguntas frecuentes
¿Por qué un elemento es un objeto pero dos son un array?
Porque XML no tiene arrays, y este es el mayor peligro de convertirlo. Un conversor ve un <line> y no puede saber si el esquema permite más. Pon el nombre del elemento en la casilla de forzar array y será un array siempre, que es contra lo que tu código necesita estar escrito. Merece la pena hacerlo antes de publicar, no después de que un pedido de un solo elemento rompa producción.
¿Por qué mis claves empiezan por @?
Son los atributos. XML tiene dos clases de miembro y JSON una, así que los atributos necesitan un prefijo o colisionan con los elementos hijos —y un elemento con un atributo sku y un hijo sku no es raro—. Puedes dejar el prefijo vacío para fusionarlos, o cambiarlo por algo más amable como un guion bajo.
¿Por qué mis números son cadenas?
Porque en XML son cadenas. El documento no tiene información de tipos, así que convertir <qty>3</qty> al número 3 es una apuesta que resulta correcta para cantidades y equivocada para referencias, códigos postales y números de teléfono. Activa el análisis de valores si tus datos no contienen identificadores con ceros a la izquierda; aun así, un cero inicial deja el valor como cadena.
¿Qué pasó con el texto alrededor de mis elementos hijos?
Se unió y se colocó bajo la clave text, y su posición se perdió. Esto es contenido mixto, y JSON de verdad no puede representarlo: un objeto no tiene orden, así que no hay dónde anotar que un texto iba antes de un hijo y otro después. Si tu XML tiene forma de documento —XHTML, DocBook, cualquier cosa con marcado dentro de prosa—, convertirlo a JSON es la operación equivocada, no una con pérdidas.
¿Puede manejar respuestas SOAP?
Sí, y activa strip namespaces, que es lo que convierte soap:Envelope en Envelope y elimina las declaraciones xmlns que de otro modo aparecerían como atributos en cada elemento. Ten en cuenta que eliminar es con pérdidas si el documento usa de verdad dos namespaces con el mismo nombre local, algo raro en SOAP y común en XML de vocabulario mixto.
¿Se sube mi XML?
No. El tokenizador y el conversor se ejecutan ambos en la pestaña que ya tienes abierta —compruébalo en el panel Network—. Importa porque el XML que circula hoy por la red es sobre todo SOAP, aserciones SAML y mensajes financieros; es decir, parte del material más delicado que maneja una persona desarrolladora.
¿Qué herramientas relacionadas debería usar después?
- Convertir JSON a XMLConvierte con atributos y nombres que XML acepta
- Convertir YAML a JSONConvierte YAML sin que «NO» se convierta en false
- Convertir JSON a YAMLConvierte con las comillas necesarias para volver sin pérdidas
- Convertir mayúsculas y minúsculasRenombra identificadores tratando bien los acrónimos