Guía

Anchors, aliases y merge keys en YAML

Entiende cómo reutiliza nodos YAML, por qué JSON no conserva referencias y qué revisar antes de convertir un archivo con merges.

por Tools in a Tab · Publicado el · Actualizada

Respuesta breve

Un anchor asigna un nombre a un nodo YAML y un alias vuelve a referirse a ese nodo. Permiten expresar reutilización dentro del grafo de datos. JSON no tiene una sintaxis equivalente: hay que expandir esas referencias o rechazarlas. No elimines solo & y *, porque puedes convertir las referencias en texto sin relación con los valores originales.

Para convertir este caso, salta a la sustitución por datos explícitos.

Un anchor y un alias

defaults: &defaults
  timeout: 30
  retries: 3

worker:
  config: *defaults

&defaults crea el anchor y *defaults es el alias. La especificación YAML 1.2.2 explica que los nombres de anchor son un detalle de serialización: el dato resuelto contiene nodos y referencias, no el nombre como propiedad ordinaria.

Qué ocurre al pasar a JSON

JSON representa árboles de objetos y arrays sin una sintaxis de referencias. Un conversor debe elegir entre expandir el nodo, inventar un esquema de referencias o rechazar la entrada. Expandir puede duplicar datos y no representa un ciclo.

El conversor YAML a JSON rechaza anchors y aliases para no ocultar esa decisión. Si quieres JSON, sustituye primero las referencias por datos explícitos y comprueba el tamaño resultante.

Merge key <<

Muchos parsers admiten << para combinar mappings:

defaults: &defaults
  timeout: 30
  retries: 3

worker:
  <<: *defaults
  retries: 5

Con la extensión merge key de YAML 1.1, worker recibe timeout: 30 y conserva su valor explícito retries: 5. Una clave explícita prevalece sobre la fusionada. El merge key no forma parte de YAML 1.2 Core: confirma que el analizador original activa esa extensión. El conversor de esta web rechaza las claves << sin comillas, además de anchors y aliases.

Sustituir el merge por datos explícitos

En este ejemplo pequeño y sin ciclos, sustituye el merge por los valores que resuelve, conservando la sobrescritura:

defaults:
  timeout: 30
  retries: 3

worker:
  timeout: 30
  retries: 5

Pega esta sustitución en el conversor YAML a JSON. Comprueba que defaults.retries sigue siendo 3, mientras que worker.retries es 5 y worker.timeout es 30. Ahora los dos objetos contienen valores independientes.

No es la misma estructura que el primer ejemplo de alias: allí el mapa reutilizado está dentro de worker.config; el merge inserta propiedades directamente en worker. Para archivos grandes, resuelve las referencias con el analizador de la aplicación y revisa su salida antes de copiar valores. La expansión no es segura con ciclos y puede aumentar mucho el tamaño de datos repetidos.

Checklist de migración

  • Busca &, * y claves << fuera de cadenas y comentarios.
  • Resuelve las referencias con el mismo parser que usa la aplicación original.
  • Detecta ciclos antes de expandir.
  • Decide si la duplicación de datos es aceptable.
  • Valida después el JSON y compara valores sobrescritos.

Una conversión segura hace explícita la pérdida de referencias; no las elimina silenciosamente.