Saltar al contenido principal

YAML vs TOML

Elige YAML para los ecosistemas que ya lo hablan —Kubernetes, pipelines de CI, Ansible— y para los documentos profundamente anidados que las personas deben leer. Elige TOML cuando un archivo debe ser inequívoco, seguro al pegar y de tipado estricto: cadenas entre comillas, fechas nativas, estructura explícita. Ambos admiten comentarios, ambos son lenguajes de configuración, y convertir entre ellos es rutina.

Solo local

YAML vs TOML: explicación

YAML y TOML existen por la misma razón: JSON hace una configuración miserable —sin comentarios, comillas obligatorias en cada clave, llaves que contar—. Partiendo de ese punto en común, los dos hicieron apuestas opuestas. YAML apostó por la brevedad mediante la inferencia: comillas normalmente opcionales, anidamiento expresado con sangría, estructura implícita. TOML apostó por lo explícito: las cadenas deben ir entre comillas, las secciones deben declararse con [headers] y nada se adivina. Ninguna apuesta es errónea; optimizan para distintos modos de fallo.

La apuesta de YAML compra archivos compactos y muy legibles —y toda una clase de errores que TOML no tiene—. Los errores de sangría reformean los documentos en silencio, y los escalares desnudos reciben tipo por inferencia, así que un código de país como NO se vuelve el booleano false (el problema de Noruega). La apuesta de TOML compra archivos más largos en profundidad pero casi imposibles de malinterpretar: la gramática es pequeña, versionada con estabilidad semver en 1.0 desde 2021, y el tipo de un valor siempre lo declara su sintaxis.

Esta página compara ambos allí donde se toman las decisiones: sintaxis y estructura, tipado y las sorpresas clásicas, comentarios y anclas, y los ecosistemas —Kubernetes y CI para YAML, Cargo y el empaquetado de Python para TOML— que normalmente deciden por ti primero.

La forma más rápida de notar la diferencia de tipado es convertir el mismo archivo en ambos sentidos — el Conversor de YAML a JSON muestra exactamente en qué se convirtió cada escalar desnudo, en tu navegador.

¿Te da curiosidad saber a qué se reduce el estilo explícito de TOML? El Conversor de TOML a JSON ejecuta el parseo localmente y no etiqueta nada, porque nada necesita inferirse.

Dos filosofías: inferido frente a declarado

La diferencia más profunda es dónde vive la estructura. En YAML, la estructura es el espacio en blanco: los niveles de sangría definen el anidamiento, y los tabuladores están prohibidos sin más. En TOML, la estructura es la puntuación: una línea como [database.pool] declara una tabla, y la sangría es puramente cosmética. Todo lo demás en esta página —seguridad al pegar, verbosidad en profundidad, mensajes de error— se deriva de esa única decisión.

AspectoYAML 1.2TOML 1.0
EstructuraSangría (solo espacios; tabuladores prohibidos)Cabeceras [table] y claves con puntos
CadenasComillas normalmente opcionalesSiempre entre comillas — "..." o '...'
TipadoInferido según el parser; NO se vuelve falseDeclarado por la sintaxis; nada se infiere
Fechas y horasTipo timestamp, dependiente del parserdate-times nativos de RFC 3339
AnclasAnclas & y alias *Ninguna — los valores se repiten o se generan
Multi-documentoSí — flujos separados por ---Un documento por archivo
Comentarios# hasta fin de línea# hasta fin de línea
Estabilidad de la especificación1.2 (2009), estratificada e intrincada1.0 (2021), pequeña y estable en semver

Sintaxis: sangría frente a cabeceras de tabla

La configuración superficial deja bien parados a ambos formatos; el anidamiento profundo los separa. YAML se vuelve cada vez más silencioso a medida que crece la estructura —dos espacios y un guion—, mientras que TOML escribe una cabecera por nivel: [database.pool.limits], luego [database.pool.limits.read]. A tres niveles, TOML es simplemente verboso; a ocho, YAML es la única opción cuerda para escribir a mano. Los arrays de tablas invierten el veredicto: los bloques [[products]] de TOML son nítidos y greppables, mientras que las listas largas de mapas en YAML son justo donde las columnas se desalinean.

La seguridad al pegar se deduce directamente. Soltar un bloque en YAML una columna más a la izquierda o a la derecha, o rompe el parseo o —peor— cambia en silencio lo que significa; el archivo sigue parseando y nada te avisa. En TOML, un bloque pegado lleva su propia [header], así que aterriza donde dice su cabecera sin importar el espacio en blanco de alrededor.

Tipos y el problema de Noruega

YAML infiere los tipos de los escalares, y la inferencia tiene dientes: yes, no, on y off se vuelven booleanos bajo las reglas de YAML 1.1 que muchos parsers aún traen de serie, NO se vuelve false, y una versión escrita 1.20 puede llegar como el número 1.2. YAML 1.2 recortó las reglas pero no unificó a los parsers, así que el mismo archivo puede recibir tipos distintos según la herramienta. La defensa es poner entre comillas todo lo que deba seguir siendo una cadena.

TOML no tiene un paso de inferencia que pueda fallar: las comillas hacen una cadena, los dígitos desnudos hacen un entero (se permiten guiones bajos para legibilidad), y las marcas de tiempo RFC 3339 son un tipo de primera clase —una ventaja genuina frente a JSON y YAML para configuración que lleva fechas—. Las cadenas multilínea existen en ambos: los bloques con triple comilla """ de TOML y los escalares | y > de YAML.

Ecosistemas y cuándo elegir cada uno

Los ecosistemas ya repartieron el territorio. YAML es dueño de lo cloud-native y del CI: manifiestos de Kubernetes, GitHub Actions y GitLab CI, Ansible, docker-compose, descripciones OpenAPI. TOML es dueño del empaquetado y de los metadatos de herramientas: el Cargo de Rust, el pyproject.toml de Python, y una larga lista de herramientas CLI que quieren configuración inequívoca y amable con los comentarios. Elegir contra un ecosistema significa pelearse para siempre con sus herramientas, así que rara vez es una elección libre.

Donde sí eliges: YAML para documentos profundamente anidados y revisados por personas, y TOML cuando los valores deben ser inequívocos, los diffs exactos y los archivos editados tanto por personas como por generadores. La recomendación se invierte con regularidad —la mayoría de los repositorios tienen ambos— y los conversores enlazados aquí tienden puentes en ambas direcciones localmente.

Preguntas frecuentes

¿Está TOML sustituyendo a YAML?

No: los dos se han repartido el territorio en vez de disputárselo. YAML está atrincherado donde las herramientas cloud-native lo exigen: Kubernetes, GitHub Actions, Ansible, docker-compose. TOML está atrincherado en el empaquetado: Cargo.toml, pyproject.toml y la configuración de la mayoría de las herramientas CLI modernas. Las herramientas nuevas eligen TOML cada vez más para ajustes sencillos, pero no hay ninguna migración seria fuera de YAML a gran escala.

¿Tiene TOML el problema de Noruega?

No. YAML infiere tipos para los escalares desnudos, así que NO se parsea como el booleano false y on u off también se vuelven booleanos. TOML exige que cada cadena vaya entre comillas, así que "NO" es inequívocamente una cadena y nunca se infiere nada. La defensa de YAML es la misma disciplina que TOML impone: pon entre comillas cualquier valor que deba seguir siendo texto.

¿Los conversores de YAML y TOML suben mi configuración?

No. Parsear y emitir ocurren dentro de tu pestaña del navegador — no hay ningún endpoint de subida, y la Content-Security-Policy del sitio solo permite peticiones de red hacia sí mismo. Abre el panel Network de DevTools mientras conviertes y no verás ninguna petición saliente; los archivos que pegues se quedan en la pestaña.

¿Por qué TOML se vuelve tan verboso en la configuración anidada?

Cada nivel de anidamiento necesita su propia cabecera entre corchetes: [database.pool.limits.read] declara tres líneas de ámbito antes del primer valor. Esa verbosidad es también la ventaja —las secciones son greppables, el ámbito es inequívoco y los diffs muestran exactamente qué se movió—. Si tu configuración se anida ocho niveles, la sangría de YAML es genuinamente la mejor opción.

¿Admiten comentarios YAML y TOML?

Sí: ambos usan # hasta el final de la línea, que es precisamente la razón por la que ambos desplazaron a JSON para la configuración. Difieren en casi todo lo demás: las anclas y los flujos multi-documento existen solo en YAML, mientras que TOML ofrece fechas RFC 3339 nativas y una gramática 1.0 estable en semver que YAML nunca ha igualado.

¿Qué formato es más seguro para copiar y pegar?

TOML. Un bloque pegado en YAML debe caer exactamente en la columna de sangría correcta, o el significado del documento cambia en silencio; incluso cuando parsea, nada te avisa. Los bloques de TOML están delimitados por sus propias [headers], así que la sangría es cosmética y una sección pegada significa lo que dice su cabecera, aterrice donde aterrice.

¿Dónde puedo leer las normas citadas aquí?

  • YAML 1.2 — Especificación de YAML, versión 1.2 (revisión 1.2.2)
  • TOML 1.0 — Especificación de TOML, v1.0.0
  • RFC 3339 — Fecha y hora en Internet: marcas de tiempo
  • YAML 1.1 — Especificación de YAML, versión 1.1