JSON vs YAML: ¿Qué formato de configuración debería usar?
Respuesta rápida
Utilice JSON para APIs, intercambio de datos y casos en los que sea importante un análisis y validación estrictos. Utilice YAML para archivos de configuración, manifiestos de DevOps y casos en los que la legibilidad humana y los comentarios sean importantes. YAML es un superconjunto JSON: cada documento JSON válido es YAML válido.
Introducción
JSON y YAML son formatos de serialización de datos legibles por humanos. JSON es estricto, mínimo y omnipresente en la web APIs. YAML es un superconjunto de JSON que agrega comentarios, cadenas multilínea, anclajes y una estructura basada en sangrías, lo que lo hace popular para archivos de configuración (Docker Compose, Kubernetes, canalizaciones de CI/CD).
Paso a paso
-
Comparar sintaxis y legibilidad
JSON usa llaves y comillas: {"key": "value"}. YAML usa sangría y dos puntos: clave: valor. YAML es más limpio para la configuración: no se necesitan comillas para las cadenas, ni comas entre elementos, ni llaves. JSON es más explícito y menos propenso a errores para el intercambio de datos.
-
Comparar características
YAML admite: comentarios (#), cadenas multilínea (|, >), anclajes (&) y alias (*), varios documentos en un archivo (---) y tipos complejos. JSON no admite ninguno de estos: ni comentarios, ni cadenas multilínea, ni referencias. La simplicidad de JSON es intencional: es un formato de intercambio de datos, no un lenguaje de configuración.
-
Comparar seguridad y análisis
El análisis de JSON es rápido y seguro: JSON.parse está integrado en todos los motores de JavaScript. El análisis de YAML es más lento y complejo: la especificación YAML tiene más de 80 páginas frente a las 2 páginas de JSON. YAML tiene riesgos de seguridad (millones de risas atacan a través de anclajes) que JSON no tiene. Utilice siempre un analizador YAML seguro que desactive los anclajes.
-
Comparar el uso del ecosistema
JSON: REST APIs, paquete.json, tsconfig.json, bases de datos NoSQL, aplicaciones web. YAML: Docker Compose, manifiestos de Kubernetes, acciones de GitHub, guías de Ansible, configuraciones de CI/CD, especificaciones de OpenAPI. JSON domina los datos en tiempo de ejecución; YAML domina la configuración.
-
Decida según su caso de uso
APIs, intercambio de datos, NoSQL, estado de la aplicación web: JSON. Archivos de configuración, DevOps, CI/CD, infraestructura como código: YAML. Si los humanos lo escriben a mano: YAML. Si las máquinas lo generan y consumen: JSON.
Ejemplos
Misma configuración en JSON y YAML
Aporte: JSON: {"server": {"port": 8080, "host": "localhost"}}
YAML: server:\n port: 8080\n host: localhost
Producción: YAML es un 30% más corto y admite comentarios. JSON es más estricto y universalmente analizable.
Problemas comunes
- Errores de sangría de YAML: YAML usa sangría para la estructura y un solo espacio incorrecto interrumpe el análisis; use un editor con YAML linting y siempre use espacios, nunca tabulaciones.
- Ataque de mil millones de risas de YAML: los anclajes y alias de YAML pueden crear una expansión exponencial, provocando DoS; utilice un analizador YAML seguro que deshabilite los anclajes (por ejemplo, yaml.safe_load en Python).
- JSON no tiene comentarios: la especificación JSON prohíbe comentarios, lo que hace que los archivos de configuración sean más difíciles de anotar; use YAML para configuraciones editadas por humanos, JSON para datos generados por máquinas.
- Sorpresas de escritura implícitas de YAML: YAML convierte automáticamente sí/no en booleanos y 1.0 en flotante, lo que puede romper campos de cadena; entrecomilla las cadenas explícitamente para evitar una coerción de tipo inesperada.
Consejos
- Utilice YAML para la configuración creada por humanos (Docker Compose, Kubernetes, CI/CD) y JSON para el intercambio de datos generados por máquinas (APIs, NoSQL, estado de la aplicación).
- Utilice siempre un analizador YAML seguro que deshabilite anclajes y alias; nunca utilice un cargador YAML de uso general en entradas que no sean de confianza.
- Al convertir YAML a JSON, espere perder comentarios, cadenas multilínea y anclajes: JSON es un subconjunto de YAML, no al revés en el caso de las funciones.
- Sangra YAML con 2 espacios de manera consistente: mezclar tabulaciones y espacios o usar sangrías inconsistentes es el error de análisis de YAML más común.