XML a JSON: Es Más Difícil de lo que Parece
Por qué convertir entre XML y JSON produce resultados sorprendentes, y cómo manejar los casos extremos.
Tienes datos XML. Tu aplicación JavaScript necesita JSON. Conviértelo y sigue adelante, ¿verdad?
Excepto que la conversión produce resultados inesperados. Los arrays que deberían existir no existen. Los atributos terminan en lugares raros. Los elementos únicos se convierten en arrays aleatoriamente.
XML y JSON modelan datos de manera diferente. Convertir entre ellos requiere decisiones.
El Desajuste Fundamental
JSON tiene: objetos, arrays, cadenas, números, booleanos, null.
XML tiene: elementos, atributos, contenido de texto, namespaces, comentarios, CDATA.
No hay mapeo 1:1.
El Problema del Array
XML no tiene arrays. Tiene elementos repetidos.
<users>
<user>Alice</user>
<user>Bob</user>
</users>
Esto probablemente debería convertirse en:
{"users": {"user": ["Alice", "Bob"]}}
¿Pero qué pasa con:
<users>
<user>Alice</user>
</users>
Un elemento. ¿Es un array con un elemento, o solo una cadena? Diferentes convertidores deciden diferente.
La consistencia importa. Si user a veces es un array y a veces una cadena, tu código se rompe.
El Problema del Atributo
XML tiene atributos. JSON no.
<product id="123">Widget</product>
Estrategias comunes de conversión:
{"product": {"_id": "123", "_text": "Widget"}}
{"product": {"@id": "123", "#text": "Widget"}}
{"product": {"$": {"id": "123"}, "_": "Widget"}}
Cada convención es diferente. Sabe qué produce tu convertidor.
El Problema del Namespace
Los namespaces XML crean nombres calificados como soap:Envelope. JSON no tiene concepto de namespaces.
Los convertidores ya sea:
- Incluyen prefijos en nombres de propiedades:
"soap:Envelope" - Eliminan prefijos:
"Envelope" - Crean estructuras anidadas para manejo de namespace
Cada enfoque tiene compensaciones.
Consejos Prácticos
Sé consistente. Elige una biblioteca de conversión y quédate con ella. Mezclar convertidores produce estructuras inconsistentes.
Fuerza arrays. Si un elemento puede tener múltiples instancias, configura el convertidor para producir siempre arrays, incluso para elementos únicos.
Prueba casos extremos. Convierte datos reales, no solo muestras. Los casos extremos en datos de producción te sorprenderán.
Considera alternativas. Si controlas ambos extremos, considera usar JSON desde el principio. Convertir de ida y vuelta pierde información.
Desafíos de JSON a XML
Ir en la otra dirección también tiene problemas.
Sin representación de array. Los arrays JSON se convierten en elementos repetidos. Necesitas nombrar esos elementos.
{"items": [1, 2, 3]}
¿Se convierte en qué? ¿<items><item>1</item>...</items>? ¿De dónde viene "item"?
Tipos numéricos. JSON distingue números de cadenas. XML no. 123 podría convertirse en <value>123</value>: ¿es un número o cadena?
Cuándo Convertir
Integrando con sistemas legados. APIs SOAP y sistemas empresariales antiguos usan XML. Convierte en el límite.
Procesando datos XML. JavaScript maneja JSON mucho mejor que XML. Convierte, procesa, convierte de vuelta si es necesario.
Migraciones únicas. Moviendo de sistemas basados en XML a basados en JSON.
Cuándo No Convertir
Requisitos de ida y vuelta. XML → JSON → XML a menudo pierde información. Atributos, namespaces, ordenamiento.
Validación de esquema. XML tiene lenguajes de esquema poderosos (XSD). JSON Schema es menos maduro.
Procesamiento de documentos. El modelo de contenido mixto de XML (texto con elementos incrustados) no se mapea limpiamente a JSON.
XML y JSON representan datos de manera diferente. La conversión requiere elecciones sobre arrays, atributos y namespaces. Entiende el comportamiento de tu convertidor y prueba con datos realistas.