Skip to content

Guía

YAML 1.1 frente a 1.2

El error de YAML más caro de todos tiene un código de país en el centro.

Por yamltojsonfree · Publicado el · Actualizado el

Qué es el problema Norway

En YAML 1.1, las palabras sin comillas y, yes, on, n, no y off son booleanos — en mayúsculas, minúsculas o capitalizadas. Así que una lista de códigos de país que contenga Noruega — NO — se convierte silenciosamente en false. Nada falla. El documento se analiza, el despliegue tiene éxito, y en algún punto más adelante falta un país en una lista porque un booleano no puede ser clave de un diccionario ni coincidir con una comparación de cadenas.

YAML 1.2, publicado en 2009, eliminó esto: solo true y false son booleanos, y esas seis palabras son cadenas normales. También descartó las otras conversiones implícitas de YAML 1.1 — 022 ya no es el octal de 18, y 12:30 ya no es un número en base 60 que vale 750.

La pega es que ambas versiones siguen muy extendidas, más de quince años después. El mismo archivo puede por tanto significar dos cosas distintas según qué herramienta lo abra — exactamente por eso el conversor de YAML a JSON de este sitio usa YAML 1.2 por defecto y marca cada valor de tu documento que se leería de forma diferente en 1.1.

Todos los valores que cambian de significado

La misma fuente, leída por cada versión de la especificación.

Fuente YAMLLeído como YAML 1.2Leído como YAML 1.1Forma segura
country: NO"NO"falsecountry: "NO"
enabled: yes"yes"trueenabled: true
debug: off"off"falsedebug: false
mode: 0222218mode: "022"
start: 12:30"12:30"750start: "12:30"
version: 1.101.11.1version: "1.10"

Fíjate en la última fila: 1.10 pierde el cero final en ambas versiones, porque se analiza como número. Las cadenas de versión deberían ir siempre entre comillas.

Qué analizadores leen qué versión

Rara vez eliges una versión de YAML directamente — la heredas de la biblioteca que use tu herramienta. Así se divide aproximadamente el ecosistema:

AnalizadorVersiónNotas
PyYAML (Python)YAML 1.1El predeterminado de la mayoría de herramientas Python, incluido Ansible.
ruamel.yaml (Python)YAML 1.2El sucesor mantenido de PyYAML; 1.1 disponible como opción.
js-yaml v5 (JavaScript)YAML 1.2El motor que usa este sitio. Las versiones anteriores leían 1.1.
go-yaml / sigs.k8s.io (Go)Mayormente 1.2Lo que usa Kubernetes; conserva algunos comportamientos de 1.1 por compatibilidad.
SnakeYAML (Java)YAML 1.1El predeterminado al cargar configuración en Spring Boot.
libyaml (C bindings)YAML 1.1La base de muchos bindings de lenguajes, PyYAML incluido.

La consecuencia práctica: un archivo escrito en un lado de esa tabla y leído en el otro puede cambiar valores en silencio. Si tu YAML lo produce Python y lo consume Kubernetes — una canalización muy común — cruza la frontera de versión. Los detalles a nivel de código están en la guía Convertir YAML a JSON en código.

Cómo escribir YAML seguro en ambas versiones

Tres hábitos eliminan toda esta clase de errores. Pon entre comillas cualquier cadena que pueda confundirse con otra cosa — códigos de país, números de versión, valores con ceros iniciales y cualquier cosa que contenga dos puntos. Escribe los booleanos solo como true y false, nunca yes, on o sus parientes. Y antes de que un archivo pase de una herramienta a otra, pásalo por un conversor o validador que informe de los valores dependientes de la versión — ver tu YAML como JSON explícito es la forma más rápida de detectar un tipo que no pretendías.

Referencias