YAML nació en 2001 como alternativa a XML y JSON para archivos de configuración. Su filosofía: maximizar legibilidad humana sin sacrificar expresividad. Un archivo YAML típico parece pseudocódigo más que un formato de datos.
Características clave:
- Indentación significativa: espacios (nunca tabs) definen la jerarquía. Dos espacios es convención, algunos usan cuatro.
- Sin llaves ni corchetes: a diferencia de JSON, la estructura se infiere de la indentación.
- Comentarios nativos:
# comentario, algo que JSON no soporta. - Tipos de datos ricos: strings, números, booleanos, null, arrays, objetos, timestamps, incluso referencias internas (
&ancla,*alias).
Ejemplo básico:
app:\n name: Genfy\n port: 3000\n features:\n - auth\n - api\n - cms
Equivalente JSON: {"app": {"name": "Genfy", "port": 3000, "features": ["auth", "api", "cms"]}}.
YAML es superset de JSON: todo JSON válido es YAML válido, pero no al revés. Esto permite migrar gradualmente de JSON a YAML.
Escalares: valores simples. Strings no necesitan comillas salvo que contengan caracteres especiales (:, #, @). Multilinea con | (preserva saltos) o > (pliega en una línea).
descripcion: |\n Primera línea.\n Segunda línea.\nresumen: >\n Esto se pliega\n en una sola línea.
Listas: - item o notación JSON [item1, item2]. Pueden anidarse:
frameworks:\n - name: React\n type: frontend\n - name: Node\n type: backend
Diccionarios: pares clave-valor. Claves con espacios requieren comillas: "Mi Clave": valor.
Anclas y alias: evitan repetición. &default define un ancla, *default la referencia:
defaults: &defaults\n timeout: 30\n retries: 3\napi:\n <<: *defaults\n endpoint: /v1
Tipos explícitos: !!str, !!int, !!bool. Útil cuando el parser infiere mal: version: !!str 1.0 (sin eso, parsea como float).
Parsers populares: PyYAML (Python), js-yaml (JavaScript), go-yaml (Go). Todos soportan YAML 1.2, la especificación actual.
CI/CD: GitHub Actions, GitLab CI, CircleCI, Travis CI usan YAML para definir pipelines. Legibilidad crítica cuando el equipo edita workflows frecuentemente.
name: Deploy\non: [push]\njobs:\n build:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v3\n - run: npm install
Infraestructura como código: Kubernetes manifests, Docker Compose, Ansible playbooks, Terraform (HCL es similar). YAML describe estado deseado del sistema.
Configuración de aplicaciones: frameworks como Symfony, Rails y Spring Boot usan YAML para config (config.yml). Más expresivo que .env, menos verboso que JSON.
No usar para:
- APIs: JSON es estándar y más eficiente para parseo automático.
- Datos grandes: YAML es lento para gigabytes de datos. Preferí JSON, CSV o formatos binarios (Parquet, Avro).
- Cuando indentación es riesgosa: un espacio de más/menos rompe todo el archivo. En equipos sin linter, JSON con llaves explícitas es más seguro.
Usa YAML si:
- Humanos editan el archivo frecuentemente (configs, CI/CD).
- Necesitás comentarios (JSON no los tiene).
- Querés reducir ruido visual (sin llaves/corchetes).
- El archivo tiene estructura compleja con anclas/alias para DRY.
Usa JSON si:
- Es para APIs o intercambio de datos entre sistemas.
- Performance de parseo importa (JSON es 3-10x más rápido).
- El equipo no está familiarizado con indentación estricta.
- Necesitás validación con JSON Schema (más maduro que YAML Schema).
Errores comunes de YAML:
- Tabs: YAML rechaza tabs. Configurá tu editor para convertir tabs en espacios.
- Strings que parecen booleanos:
country: NOparsea comofalse(NO es booleano noruego legacy). Usá comillas:country: "NO". - Indentación inconsistente: mezclando 2 y 4 espacios. Usá un linter (yamllint) en pre-commit.
Herramientas: yq (como jq pero para YAML), VS Code con extensión YAML (autocompletado + validación), Genfy ofrece conversores YAML ↔ JSON online.
Ejemplos
# Configuración de app\napp:\n name: MiApp\n version: 1.0.0\n features:\n - auth\n - payments# Docker Compose\nservices:\n web:\n image: nginx\n ports:\n - "80:80"# GitHub Action\nname: CI\non: [push]\njobs:\n test:\n runs-on: ubuntu-latest\n steps:\n - run: npm test# Anclas y alias\ndefaults: &base\n timeout: 30\napi:\n <<: *base\n url: /v1# Multilinea\ndescripcion: |\n Primera línea\n Segunda línea
Preguntas frecuentes
¿YAML soporta comentarios?
Sí. Los comentarios empiezan con # y van hasta el final de la línea. Esto es ventaja clave sobre JSON, que no soporta comentarios nativamente (solo workarounds como claves especiales).
¿Puedo usar tabs en YAML?
No. YAML rechaza tabs explícitamente. Solo espacios. La razón: tabs tienen ancho ambiguo (2, 4, 8 espacios según el editor), lo que rompe la indentación significativa. Configurá tu editor para convertir tabs en espacios.
¿YAML es más lento que JSON?
Sí. Parsear YAML es 3-10x más lento que JSON porque tiene sintaxis más compleja (anclas, multilinea, tipos implícitos). Para archivos de configuración pequeños no importa; para APIs con miles de requests/segundo, JSON es preferible.