XML ⇄ JSON

Pega cualquiera de los dos formatos: el otro aparece mientras escribes, en ambos sentidos.

Cómo se usa

  1. Pega XML o JSON en el cuadro: el resultado se dibuja mientras escribes, no hay ningún botón que pulsar. La dirección se detecta a partir del primer carácter (< para XML, [ o { para JSON) y se muestra encima del resultado para que puedas comprobarla.
  2. Si la dirección se ha adivinado mal, elige XML → JSON o JSON → XML. Las opciones de abajo cambian según la dirección: XML → JSON muestra «Detectar números y booleanos», y JSON → XML muestra el «Nombre raíz» para envolver arrays.
  3. Copia o descarga el resultado. Ambos usan exactamente el texto que ves en pantalla; el archivo se llama data.json o data.xml. «Cargar ejemplo» rellena un ejemplo para la dirección activa.

Ejemplo

Entrada (XML)

<nota id="1"><para>Ana</para><de>Luis</de><cuerpo>¡Hola!</cuerpo></nota>

Resultado (JSON)

{
  "nota": {
    "@id": "1",
    "para": "Ana",
    "de": "Luis",
    "cuerpo": "¡Hola!"
  }
}

El atributo id pasa a «@id», cada elemento hijo pasa a ser una clave y el texto dentro de <cuerpo> pasa a ser un valor de cadena. Desactiva «Detectar números y booleanos» para conservar todos los valores, incluido el id, como texto.

Reglas, límites y problemas conocidos

  • No hay carga de archivos, arrastrar y soltar ni descarga desde una URL: pega el texto. Una zona para soltar archivos se comería la altura que necesita el resultado, y leer archivos correctamente implica gestionar codificaciones que no son UTF-8; abre el archivo en el formateador XML (GB18030, Big5, Windows-1256) y copia el texto.
  • La entrada está limitada a 1.000.000 de caracteres; a partir de 200.000 el resultado espera a que dejes de escribir y lo indica. Por encima del límite máximo recibes un error explícito: la entrada nunca se trunca en silencio.
  • La correspondencia es fija a propósito: un elemento pasa a ser un objeto; un atributo pasa a «@nombre»; el texto del elemento pasa a «#text»; un elemento hijo pasa a ser una clave; y varios hijos con el mismo nombre pasan a ser un array. Un elemento hoja que solo contiene texto pasa a ser una cadena simple, de modo que un documento muy anidado sigue siendo legible.
  • La detección de tipos (XML → JSON) es conservadora: solo true / false / null (en minúsculas) y números JSON estrictos se convierten a tipos reales. Un entero con cero inicial (00501) y un número de 16 dígitos o más se quedan como cadena; todo lo demás se queda como texto cuando la opción está desactivada. Los atributos siempre se conservan como texto, nunca se reconvierten, porque los atributos XML son textuales.
  • JSON → XML necesita una sola raíz, así que un objeto de nivel superior usa su única clave como elemento raíz. Un array JSON de nivel superior no tiene raíz única y se envuelve en el elemento «Nombre raíz», con cada elemento como hijo repetido (llamado «item» por defecto).
  • Un valor JSON bajo una clave puede ser un objeto, un array, una cadena, un número, true / false o null. Las claves «@nombre» pasan a atributos (null / undefined se omiten); «#text» pasa a ser el texto del elemento; cualquier otra clave pasa a ser un elemento hijo. Los arrays generan elementos repetidos.
  • Los comentarios XML, las instrucciones de procesamiento (<? … ?>) y el DOCTYPE se descartan y se cuentan (no pueden representarse en JSON); CDATA se conserva como texto. El contenido mixto —texto junto a elementos hijos— se aplana en «#text» y su orden original no se conserva; los elementos afectados se cuentan para que puedas verlo.
  • El JSON se analiza de forma estricta: sin comentarios, sin comas finales, sin comillas simples, sin caracteres de control sin escapar y con una anidación de hasta 64 niveles. No se acepta un objeto por línea (JSON Lines): envuelve primero los objetos en un array.
  • Las referencias a entidades XML (&amp; &lt; &gt;) se conservan tal cual en el texto y en los atributos (no se descodifican), de modo que una ida y vuelta reproduce los bytes exactos. El escapado se añade en el sentido JSON → XML: & < > se escapan en el texto y « se escapa en los valores de atributo.
  • Fuera de alcance: XSLT, XPath, validación con XML Schema, espacios de nombres como algo distinto de parte del nombre de la etiqueta, JSON con claves duplicadas (gana la última, como JSON.parse) y conservar el orden de los comentarios. Nada se sube, se guarda ni se pone en la URL.

Lo que suele hacer falta después, cuando los datos ya están en el otro formato.