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.