Los tres representan datos estructurados como texto. JSON es el más simple y estricto, y el formato por defecto de las API web. YAML es el más cómodo de escribir a mano y admite comentarios, por eso lo usan los archivos de configuración (Kubernetes, canalizaciones de CI, Ansible), pero su tipado implícito tiene trampas. XML es el más verboso, pero tiene atributos, espacios de nombres, mezcla de texto y marcado y una validación por esquemas muy madura, así que sigue siendo el formato de los documentos y de los estándares de larga vida (archivos de Office, SVG, RSS, SOAP, mapas del sitio).
De un vistazo
| Propiedad | JSON | YAML | XML |
|---|---|---|---|
| Estructura | Objetos, matrices, escalares | Mapas, secuencias, escalares (por sangría) | Árbol de elementos con atributos y texto |
| Tipos integrados | Cadena, número, true/false, null | Cadenas, enteros, decimales, booleanos, null, marcas de tiempo (según el esquema) | Todo es texto salvo que un esquema diga otra cosa |
| Comentarios | No | Sí, # |
Sí, <!-- --> |
| Legibilidad a mano | Buena | La mejor | Verboso |
| Rigidez | Muy estricto (sin comas finales, solo comillas dobles) | Permisivo; los espacios en blanco importan | Buena formación estricta |
| Referencias y reutilización | No | Anclas y alias (&, *) |
Entidades, XInclude |
| Espacios de nombres | No | No | Sí |
| Lenguajes de esquema | JSON Schema | Normalmente JSON Schema | XSD, DTD, RELAX NG |
| Usos típicos | API REST, almacenamiento del navegador, registros, manifiestos de paquetes | Configuración, canalizaciones de CI, Kubernetes, Ansible | Documentos de Office, SVG, RSS/Atom, SOAP, mapas del sitio |
El mismo registro en cada formato:
{
"name": "web-01",
"port": 8080,
"enabled": true,
"tags": ["prod", "eu"]
}
# Server settings
name: web-01
port: 8080
enabled: true
tags:
- prod
- eu
<!-- Server settings -->
<server name="web-01">
<port>8080</port>
<enabled>true</enabled>
<tags>
<tag>prod</tag>
<tag>eu</tag>
</tags>
</server>
Estos archivos ocupan 84, 78 y 161 bytes. Las versiones JSON y YAML producen exactamente los mismos datos; en la versión XML, 8080 y true son solo texto, y quien la escribió tuvo que decidir si name es un atributo o un elemento hijo.
JSON
JSON tiene seis clases de valor y una sola forma de escribir cada una, así que los analizadores de todos los lenguajes coinciden en lo que significa un documento. Esa previsibilidad es la razón de su éxito en las API. El precio es que no perdona al editarlo a mano: una coma final o una cadena entre comillas simples invalidan todo el archivo. Compruebe los archivos con el validador de JSON.
Elija JSON cuando los programas intercambien datos: peticiones y respuestas de API, mensajes, registros, almacenamiento del navegador o cualquier archivo escrito sobre todo por software.
YAML
YAML usa la sangría en lugar de llaves y corchetes, y admite comentarios, cadenas de varias líneas y anclas para evitar repeticiones. Es agradable de escribir pero fácil de equivocarse sin notarlo. Los analizadores YAML 1.1, todavía comunes (PyYAML es uno), deducen el tipo de los valores sin comillas:
| Usted escribe | YAML 1.1 lo lee como |
|---|---|
country: no |
false (el «problema de Noruega») |
version: 1.10 |
el número 1.1 |
zip: 01234 |
el número octal 668 |
time: 12:30 |
el número 750 (base 60) |
Ponga entre comillas los valores que deban seguir siendo cadenas y valide con el validador de YAML. No cargue nunca YAML no fiable con un cargador capaz de construir objetos arbitrarios; use el cargador seguro de su biblioteca.
Elija YAML cuando las personas editen el archivo a mano y los comentarios ayuden: configuración de aplicaciones, manifiestos de despliegue, flujos de CI.
XML
XML separa el marcado del texto, así que puede representar documentos donde se mezclan prosa y estructura (<p>Click <b>here</b></p>), no solo registros. Los espacios de nombres permiten que varios vocabularios compartan un archivo, y XSD puede imponer tipos, rangos y estructura antes de aceptar los datos. Es verboso, y los analizadores deben configurarse con cuidado: desactive las entidades externas y el procesamiento de DTD con entradas no fiables para evitar los ataques XXE y «billion laughs».
Elija XML cuando lo exija un estándar o un socio, cuando los documentos mezclen texto y marcado, o cuando necesite una validación estricta por esquema y espacios de nombres.
¿Cuál elegir?
- API web o datos que pasan entre programas: JSON.
- Configuración que editan y comentan personas: YAML (con comillas en las cadenas que parezcan números o booleanos).
- Documentos, contenido mixto o un estándar XML establecido: XML.
- Convertir entre ellos: el conversor de JSON a YAML, el conversor de YAML a JSON, el conversor de JSON a XML y el conversor de XML a JSON lo hacen en el navegador; en las conversiones con XML habrá que decidir entre atributos y elementos.
Para las reglas de sintaxis de JSON en detalle, vea Cómo funciona JSON.