Skip to content
Back to Blog
format-comparisons

YAML vs. JSON vs. TOML: Cómo elegir un formato de configuración

2026-05-17 9 min read

Por qué la elección del formato de configuración realmente importa

Elige el formato de configuración incorrecto y pasarás horas depurando una coma que falta. Lucharás con un analizador que elimina una clave en silencio. Tendrás que explicar las arcanas reglas de indentación a un nuevo miembro del equipo, otra vez. No son hipotéticos. Son esos pequeños cortes que desangran los proyectos, semana tras semana. En el software moderno, casi siempre te encontrarás con YAML, JSON o TOML. Docker Compose usa YAML. Las API REST hablan abrumadoramente en JSON. El gestor de paquetes de Rust, Cargo, eligió TOML. Cada una de estas elecciones refleja un equilibrio deliberado entre la facilidad de escritura para humanos, la facilidad de análisis para máquinas y el poder expresivo. La diferencia entre un proyecto mantenible y uno frágil a menudo se reduce a entender esos equilibrios, en lugar de simplemente copiar el formato que usó el primer tutorial que encontraste. Compararemos los tres en las dimensiones que realmente importan: sintaxis, tipos de datos, comentarios, cadenas de texto multilínea y herramientas. También cubriremos por qué querrías convertir entre ellos y, más importante aún, los límites reales de ese proceso de conversión. Es mejor conocerlos antes de empezar.

JSON: estricto, portable y sorprendentemente doloroso de escribir a mano

JSON, o JavaScript Object Notation, tiene una característica definitoria: la rigidez. Fue estandarizado como RFC 8259 en 2017, pero su alma proviene de la especificación original de Douglas Crockford de principios de los 2000. Hay exactamente una forma de escribir cualquier estructura de datos. Las claves requieren comillas dobles. Las comas al final están prohibidas. ¿Y los comentarios? No existen. Al menos, no en la especificación. En la comunicación de máquina a máquina, esa rigidez es una ventaja, no un error. La previsibilidad de JSON es la razón por la que conquistó el mundo de las API REST y las herramientas de compilación. Todos los lenguajes principales tienen un analizador en su biblioteca estándar, y como el formato es tan inequívoco, puedes estar seguro de que lo que envías es lo que recibirán. Simplemente funciona. El dolor llega en el momento en que un humano tiene que escribirlo. Cualquiera que haya pasado diez minutos buscando una coma faltante en un `webpack.config.js` gigante conoce esta sensación. Un bloque simple de conexión a la base de datos está bien: ```json { "database": { "host": "localhost", "port": 5432, "name": "myapp_production" } } ``` Pero, ¿qué pasa si escalas eso a 40 claves, lo anidas tres niveles y olvidas una coma? El analizador a menudo simplemente se rinde, apuntándote al final del archivo con un error críptico en lugar de a la línea del problema real. La falta de comentarios es igual de frustrante. La gente recurre a trucos como `"_comment": "esta configuración controla el TTL de la caché"`, contaminando el modelo de datos solo para dejarse una nota a sí mismos en el futuro. Por eso existen formatos como JSON5 y JSONC (JSON con comentarios). Son populares (el `settings.json` de VS Code usa JSONC), pero son fundamentalmente no estándar. No te dejes engañar pensando que son una opción segura por defecto. Si envías un archivo JSONC a un analizador estándar, va a fallar.

YAML: máxima legibilidad, máximos peligros ocultos

YAML, que significa YAML Ain't Markup Language (YAML no es un lenguaje de marcado), prioriza la legibilidad humana. Descarta las llaves y comillas de JSON a favor de una estructura limpia basada en la indentación. Tiene comentarios nativos (`#`) y maneja cadenas de texto multilínea con elegancia. Un flujo de trabajo de GitHub Actions o un manifiesto de Kubernetes escrito en YAML es innegablemente más fácil de escanear para un humano que su contraparte en JSON. Así es como se ve esa misma configuración de base de datos en YAML: ```yaml database: host: localhost port: 5432 name: myapp_production # conjunto de réplicas añadido el 2024-03-10 replicas: - replica1.internal - replica2.internal ``` Es más limpio, y el comentario crucial que explica el cambio es un ciudadano de primera clase. Las cadenas multilínea también son un problema resuelto usando escalares de bloque (los caracteres `|` y `>`), lo que permite incrustar consultas SQL o scripts de shell en una configuración sin que se convierta en un desastre ilegible. Pero esta legibilidad tiene un precio, y se paga con ambigüedad y peligros ocultos. Estas son las infames 'trampas' de YAML. La más famosa es el 'problema de la bandera noruega', donde el código de país `NO` es interpretado como el booleano `false` por defecto en versiones antiguas de YAML (¡que muchas herramientas todavía usan!). Un solo espacio mal colocado en la indentación no genera un error; cambia silenciosamente toda la estructura de tus datos. La especificación en sí tiene unas monstruosas 86 páginas, ¡más larga que la especificación de HTTP/1.1!, lo que te dice cuánta complejidad se esconde bajo esa superficie aparentemente simple. ¿Y eso en qué nos deja? Para la infraestructura como código y los pipelines de CI/CD, donde los archivos de configuración son escritos y revisados por humanos todo el día, la legibilidad de YAML a menudo vale la pena el riesgo. Pero para configuraciones generadas por código y que rara vez se tocan a mano, esa ventaja se evapora y te quedas solo con sus peligros.

TOML: el término medio pragmático

TOML, o Tom's Obvious, Minimal Language (el lenguaje obvio y mínimo de Tom), es la elección pragmática. Creado por el cofundador de GitHub, Tom Preston-Werner, y finalizado como versión 1.0.0 en 2021, su única razón de ser es ser un formato de configuración obvio e inequívoco que aun así sea agradable de leer. Se parece un poco a un archivo INI de la vieja escuela, con encabezados de sección entre corchetes, pero añade tipos de datos explícitos, que es su característica estrella. Esta estructura fomenta una configuración más plana, lo que puede ser una restricción saludable. ```toml [database] host = "localhost" port = 5432 name = "myapp_production" # conjunto de réplicas añadido el 2024-03-10 replicas = ["replica1.internal", "replica2.internal"] ``` Aquí es donde TOML responde directamente a los mayores problemas de YAML. No hay cadenas de texto ambiguas sin comillas. `port = 5432` es un entero. `enabled = true` es un booleano. `NO` es simplemente la cadena de texto 'NO'. Nunca tienes que preocuparte de que un valor se convierta mágicamente en algo que no pretendías. También tiene soporte de primera clase para fechas y horas, incluyendo marcas de tiempo RFC 3339, lo cual es un gran alivio para cualquiera que haya tenido que lidiar con cadenas de texto para fechas. Su principal debilidad es representar datos muy anidados o muy repetitivos. La sintaxis `[[section]]` para un array de tablas funciona para casos simples, como las entradas `[[bin]]` de Cargo, pero se vuelve torpe rápidamente. Si necesitas tres o cuatro niveles de anidación, el modelo de indentación de YAML de repente parece mucho más atractivo. TOML también omite deliberadamente características como las anclas y alias de YAML, así que si necesitas reducir la duplicación entre entornos, no tienes suerte. Los archivos TOML grandes pueden volverse muy repetitivos. Su adopción es sólida pero no universal. Python añadió `tomllib` a su biblioteca estándar en la versión 3.11, un importante voto de confianza. Antes de eso, tenías que usar un paquete de terceros. Si tu equipo está inmerso en los ecosistemas de Rust, Python moderno o Go, TOML es una opción excelente y cómoda. Para proyectos que abarcan muchos lenguajes diferentes, querrás verificar primero la disponibilidad de analizadores antes de comprometerte.

Cara a cara: una tabla comparativa de características

Pongamos todos los pros y contras en un solo lugar. Aquí tienes una comparación directa de las características que causan más dolores de cabeza en archivos de configuración del mundo real. **Comentarios:** YAML y TOML: Sí, mediante comentarios de línea con `#`. JSON: No. No está en la especificación, y nunca lo estará. Asúmelo. **Comas finales:** YAML y TOML: No aplica, ya que no usan comas como delimitadores principales. JSON: Prohibidas. Una fuente clásica de frustrantes `diffs` de git y errores de análisis. **Cadenas multilínea:** YAML: Excelente soporte mediante escalares de bloque (`|`, `>`), aunque los indicadores de `chomping` (`-`, `+`) pueden ser complicados. TOML: Buen soporte con cadenas de triple comilla. JSON: Pésimo. Estás obligado a añadir escapes `\n` manualmente. Es feo y propenso a errores. **Tipos de fecha y hora:** TOML: Sí, objetos de fecha y hora de primera clase. YAML: Sí, en la versión 1.2, pero el soporte de los analizadores puede ser inconsistente. JSON: No. Las fechas son solo cadenas de texto por convención, y depende de ti analizarlas. **Anclas y alias (configuraciones DRY):** YAML: Sí, con `&anchor` y `*alias`. Una característica potente pero a menudo confusa para reducir la repetición. TOML y JSON: No. O te repites o dependes de un paso de preprocesamiento. **Validación de esquemas:** JSON: Sí, con JSON Schema, un estándar maduro y ampliamente soportado. YAML: Puede usar JSON Schema, pero requiere herramientas específicas (`ajv`, `yamale`). TOML: Las herramientas son mucho menos maduras aquí. Es un punto débil claro. **Tamaño de archivo para datos equivalentes:** JSON es el más compacto una vez minificado. Para archivos legibles por humanos, YAML y TOML son comparables. La diferencia rara vez supera el 10-15% para una configuración típica, así que este no es un factor decisivo importante. **Velocidad de análisis:** Para leer una configuración al inicio de una aplicación, todos son suficientemente rápidos. Para serialización de alto rendimiento (miles de operaciones por segundo), JSON es el campeón indiscutible, gracias a bibliotecas altamente optimizadas como `simdjson`.

Convertir entre formatos: qué funciona y qué no

Tarde o temprano, necesitarás convertir entre estos formatos. Quizás estés migrando un proyecto, generando una configuración YAML desde una API JSON, o pasando un archivo TOML a una herramienta antigua que solo entiende JSON. Sucede. CocoConvert puede hacer el trabajo mecánico por ti con sus conversores de JSON a YAML, YAML a JSON, TOML a JSON y JSON a TOML. Para configuraciones simples con tipos de datos básicos, la conversión es rápida y sin pérdidas. Simplemente sube tu archivo en la página de conversión, elige tu formato de destino y listo. Pero la conversión automatizada tiene límites estrictos. Debes ser consciente de lo que se pierde en la traducción, porque no es un error de la herramienta, es una incompatibilidad fundamental entre los formatos. **Los comentarios se pierden al pasar a JSON.** JSON no tiene el concepto de comentarios. Punto. Cuando conviertes un archivo YAML o TOML con comentarios a JSON, esos comentarios desaparecen para siempre. No hay solución; es una limitación de la propia especificación de JSON. **Las anclas de YAML se expanden, no se conservan.** Si tu archivo YAML usa `&defaults` y `*defaults` para no repetirse (DRY), esa estructura se perderá. El conversor expandirá las anclas, lo que significa que los datos de salida son idénticos, pero estarán duplicados en todas partes. El archivo resultante funcionará, pero no será tan fácil de mantener. **Las fechas y horas de TOML pueden convertirse en cadenas de texto.** El tipo nativo de TOML `created_at = 2024-01-15T09:30:00Z` no tiene un equivalente directo en JSON. CocoConvert lo convertirá en una cadena de texto estándar ISO 8601, que es la convención correcta. Pero la aplicación que lea ese JSON necesita ser lo suficientemente inteligente como para saber que debe analizar esa cadena y convertirla de nuevo en un objeto de fecha. **TOML muy anidado a YAML** funciona bien estructuralmente, pero el resultado puede ser sorprendente. La sintaxis `[[array of tables]]` de TOML se mapea a una secuencia de mapeos en YAML, lo que puede parecer extraño si no estás acostumbrado a verlo. Siempre revisa el resultado de la conversión antes de confiar en él en producción. Un `diff` rápido contra un archivo que has convertido de ida y vuelta (un viaje redondo) es la mejor manera de detectar cualquier sorpresa.

Tomando la decisión: qué formato para cada situación

No hay una única respuesta correcta, pero no dejes que eso te engañe y pienses que la elección no importa. Han surgido heurísticas claras sobre cuándo usar cada formato. **Usa JSON cuando:** La configuración es para máquinas, no para personas. Si está siendo generada y consumida por herramientas, y los humanos rara vez la editarán a mano, la rigidez de JSON es una virtud. Por eso `package.json` y `tsconfig.json` son JSON. El objetivo es la máxima compatibilidad. **Usa YAML cuando:** Los humanos son la audiencia principal. Para manifiestos de Kubernetes, GitHub Actions o playbooks de Ansible, la legibilidad es primordial. La configuración es escrita y revisada constantemente por personas. Sí, los peligros son reales, pero son manejables. Mi única recomendación no negociable: si usas YAML, *debes* forzar el uso de un linter como `yamllint` en tu pipeline de CI. Sin excepciones. **Usa TOML cuando:** Quieres la legibilidad de YAML sin su peligrosa ambigüedad. Si tu configuración es mayormente plana y tu equipo trabaja en un ecosistema con buen soporte (como Rust con Cargo.toml o Python moderno con pyproject.toml), TOML es una opción fantástica. También es el formato más amigable para que los usuarios finales de tu aplicación lo editen, ya que la sintaxis es simple y los errores del analizador suelen ser útiles. **Cuando ninguno de los tres encaja perfectamente:** Da un paso atrás y pregúntate si un archivo de configuración estático es siquiera la herramienta adecuada. Los pares clave-valor simples a menudo pueden vivir en variables de entorno. Para escenarios verdaderamente complejos con lógica condicional, intentar encajarlo a la fuerza en YAML o TOML es un error. Ya se te han quedado pequeños. Es hora de admitir que necesitas un lenguaje de programación real para tu configuración, ya sea un lenguaje de configuración dedicado como Dhall o Starlark, o simplemente un script de Python sencillo. Es un compromiso mayor, pero es mejor que construir un monstruo a base de YAML anidado. Si te encuentras atascado en el lado equivocado de una de estas decisiones a mitad de proyecto, CocoConvert puede encargarse de la migración. Sin embargo, la elección estratégica de qué formato sirve mejor a tu equipo sigue dependiendo de ti.