Saltar al contenido principal

Convertir YAML a JSON

YAML a JSON convierte un documento YAML a JSON en tu navegador usando el esquema core de YAML 1.2. Importa más de lo que parece: bajo el predecesor anterior a 1.2 que todavía usan PyYAML y Ruby, los tokens sin comillas NO, yes, on y off se resuelven como booleanos, así que una lista de códigos de país ISO pierde Noruega. Aquí siguen siendo cadenas, y todo lo que se resolvería de forma distinta bajo 1.1 se señala.

Solo local
Sangría
YAML
0 B1 líneaLín. 1, Col. 1
JSONsolo lectura
0 B1 línea

¿Cómo funciona Convertir YAML a JSON?

YAML parece simple y no lo es. La especificación es más larga que las de JSON, XML y TOML juntas, y la mayoría de las sorpresas vienen de una decisión de diseño: los escalares sin comillas se resuelven por patrón en lugar de declararse por sintaxis. Lo que significa un token depende de qué tabla de resolución esté usando el lector.

El problema de Noruega es un problema de versiones

YAML 1.1 resolvía y , yes, on, n, no y off como booleanos. Así que countries: [NO, SE, DK] se cargaba como [false, "SE", "DK"], y un archivo de configuración que decía norway: no significaba algo que nadie pretendía. YAML 1.2 los eliminó todos, junto con los números sexagesimales: por eso 1.1 leía 12:30 como el entero 750.

La trampa está en que el software que la gente ejecuta de verdad está dividido. El cargador por defecto de PyYAML y el Psych de Ruby son 1.1; el yaml.v3 de Go y los parsers de JavaScript modernos son 1.2. Este conversor aplica 1.2 y te dice, por su nombre, cada token en el que un lector 1.1 discreparía, porque la salida útil no es solo el JSON sino saber que el archivo es ambiguo.

Las anclas se expanden, con un límite

&name define una ancla y *name la referencia. JSON no tiene equivalente, así que cada referencia se expande en una copia. Esa expansión es el ataque «billion laughs»: diez anclas que referencian cada una dos veces a la anterior se expanden a 1,024 nodos, veinte a un millón, treinta a más de mil millones. Un archivo de 200 bytes puede agotar el heap. La expansión se limita a 100,000 nodos y el límite se informa, que es la diferencia entre un error claro y una pestaña colgada.

Los escalares de bloque conservan sus saltos de línea

| conserva los saltos de línea, > los pliega en espacios, y el indicador de chomping decide qué pasa con el último: | conserva exactamente uno, |- los quita todos, |+ conserva todos. Esa última distinción importa para una clave PEM o un script de shell cuya última línea tiene que terminar con salto. Un # dentro de un escalar de bloque es contenido, no comentario —un parser que lo elimina se come el shebang de cada script.

Las claves duplicadas se informan, no se ocultan

YAML dice que una clave duplicada es un error. La mayoría de los parsers se quedan en silencio con la última. Este conserva la última, igual que JSON.parse, y dice qué clave y en qué línea, porque un duplicado en un archivo de configuración es casi siempre un merge que salió mal.

YAML

regions: [NO, SE]
version: "007"
retry: 012

JSON

{
  "regions": ["NO", "SE"],
  "version": "007",
  "retry": 12
}
// warning: 012 — leading zero, 1.1 reads it as octal

¿Qué opciones y casos límite admite Convertir YAML a JSON?

Referencia técnica y opciones
ParámetroTipoValor predeterminadoComportamiento y casos límite
true / falsebooleanoresueltosSolo estas dos grafías, con cualquier combinación de mayúsculas. Ahí está toda la diferencia con YAML 1.1, y por eso Noruega sobrevive.
yes / no / on / off / y / nstringmarcadosBajo 1.2 son cadenas, bajo 1.1 booleanos. Cada uno se notifica por su nombre, así sabes que el archivo significa cosas distintas según el runtime.
~ / null / (vacío)nullresueltosLos tres escriben un null de JSON. Un valor vacío tras una clave es null, no una cadena vacía.
012entero12, marcado1.2 lee el cero inicial como decimal; 1.1 lo lee como octal 10; el autor probablemente quería la cadena. Ponlo entre comillas para conservar el cero.
0o17 / 0x1fentero15 / 31Octal y hexadecimal explícitos. 1.2 exige el prefijo 0o para el octal, por eso un 017 a secas no es 15.
.inf / .nanstringse mantienen como textoJSON no tiene ninguno, así que emitirlos produce un documento que JSON.parse rechaza. El token se conserva literal y se marca.
Anclas y aliasexpandidoslímite de 100,000 nodosCada *alias se convierte en una copia, porque JSON no tiene referencias. El límite evita que una expansión billion-laughs agote la memoria.
Claves de fusión (<<)no soportadonotificadoSe rechaza antes que implementarlo a medias. La semántica de fusión interactúa con la sobreescritura y el orden de maneras en que es fácil equivocarse sutilmente y difícil percatarse.
Multi-documentoseparados por ---arrayVarios documentos se convierten en un array de JSON. Desactiva la opción para convertir solo el primero, que es lo que suele querer un paquete de manifiestos de Kubernetes.
Tamaño de entradabytes8 MBEl análisis corre en el hilo principal. Por encima del techo, la herramienta se niega en vez de congelar la pestaña.

Preguntas frecuentes

¿Por qué mi `no` es una cadena y no false?

Porque este parser aplica el esquema core de YAML 1.2, donde solo true y false son booleanos. YAML 1.1 —que es lo que todavía usan el cargador por defecto de PyYAML y el Psych de Ruby— resuelve no, yes, on, off, y y n como booleanos, y así es como una lista de códigos de país ISO pierde Noruega en silencio. Si quieres un booleano, escribe true o false; si quieres la cadena, ya la tienes.

¿Qué versión de YAML debería asumir que usan mis herramientas?

Compruébalo en lugar de asumirlo, porque la división es real y en la práctica no se indica la versión: el safe_load de PyYAML y el Psych de Ruby son 1.1, el gopkg.in/yaml.v3 de Go y la mayoría de los parsers de JavaScript actuales son 1.2. La respuesta fiable es poner entre comillas todo lo ambiguo: un escalar entre comillas es una cadena en todas las versiones de YAML publicadas, lo que vuelve irrelevante la pregunta.

¿Qué pasó con mis anclas?

Se expandieron. JSON no tiene forma de expresar una referencia, así que cada *alias se convierte en una copia completa de lo que tenía la ancla. Es sin pérdidas para los datos y con pérdidas para la estructura: el hecho de que dos partes del documento fueran el mismo objeto desaparece. Si necesitas conservar eso, JSON es el destino equivocado.

¿Por qué se negó a expandir mis alias?

Los alias anidados se multiplican. Si cada ancla referencia dos veces a la anterior, treinta niveles se expanden a más de mil millones de nodos a partir de un archivo que cabe en una pantalla: el ataque billion laughs, que ha derribado servicios reales. La expansión se detiene en 100,000 nodos y lo dice, en lugar de crecer hasta que la pestaña muera.

¿Por qué mi número conserva las comillas en la salida?

Porque lo pusiste entre comillas en el YAML, y un escalar entre comillas es una cadena en todas las versiones de YAML. Ese es el comportamiento correcto y, por lo general, la intención: version: "007" y version: 007 son valores genuinamente distintos, y solo uno de ellos sobrevive a un viaje de ida y vuelta tal como está escrito.

¿Se sube mi YAML?

No. El parseo y la conversión se ejecutan en la pestaña que ya tienes abierta: mira el panel «Network» mientras pegas. Esto importa de forma especial para YAML, porque el YAML que la gente necesita convertir suele ser un manifiesto de Kubernetes, un workflow de CI o un archivo docker-compose, es decir, un archivo lleno de detalles de infraestructura y, a veces, de secretos.