JSON y YAML son dos notaciones para los mismos datos
JSON agrupa los objetos entre llaves { } y las matrices entre corchetes [ ], y pone comillas dobles a las claves y a las cadenas. YAML expresa la misma estructura con sangría y un guion (-) al principio de cada elemento de una lista, y prescinde de casi todas las comillas. Un objeto JSON pasa a ser un mapeo de YAML y una matriz pasa a ser una secuencia. Los números, los booleanos y null también se corresponden. La especificación de YAML 1.2 indica que el objetivo principal de esa versión era que YAML fuera un superconjunto estricto de JSON, y por eso la mayoría de los documentos JSON válidos se pueden leer tal cual como YAML.
Los dos paneles de este conversor se pueden editar. Si editas el de JSON, el de YAML se vuelve a generar; si editas el de YAML, se vuelve a generar el de JSON. La flecha del centro indica qué panel es ahora el original. Al hacer clic en una línea o moverte con las teclas de flecha, se ilumina en el otro panel la línea con el mismo valor, y la línea de ruta de abajo muestra la posición, por ejemplo owner › name, y el tipo del valor. Resulta especialmente útil en archivos YAML largos, donde la sangría por sí sola no basta para saber a qué elemento pertenece una línea.
| Dato | JSON | YAML |
|---|---|---|
| Objeto / mapeo | {"port": 8080} | port: 8080 |
| Matriz / secuencia | {"tags": ["web", "api"]} | tags: |
| Anidamiento | {"db": {"host": "localhost"}} | db: |
| Número y cadena con aspecto de número | {"a": 8080, "b": "8080"} | a: 8080 |
| Booleano y valor vacío | {"on": true, "x": null} | "on": true |
| Cadena de varias líneas | {"memo": "primera línea\nsegunda línea"} | memo: |- |
| Objeto vacío y matriz vacía | {"a": {}, "b": []} | a: {} |
Cuándo hay que pasar de JSON a YAML y al revés
Los archivos de configuración que editan las personas suelen estar en YAML, mientras que los datos que se intercambian los programas suelen estar en JSON. Por eso es habitual tener que usar los dos formatos en una misma tarea.
- Manifiestos de Kubernetes: la documentación de Kubernetes recomienda escribir los archivos de configuración en YAML en lugar de JSON. Funcionan los dos, pero YAML resulta más legible para las personas. Hace falta convertir cuando quieres guardar como archivo YAML un recurso que has obtenido del clúster en JSON, o cuando pasas un manifiesto YAML a una API o a un script que solo acepta JSON.
- Docker Compose y GitHub Actions: ambas herramientas aceptan la configuración únicamente en YAML. Si un ejemplo o una respuesta de API viene en JSON, hay que trasladarlo a YAML, y si se olvidan unas comillas puede cambiar el tipo de un valor.
- Validar y comparar: para comprobar una configuración YAML con una herramienta que recibe JSON, como un validador de JSON Schema o jq, primero hay que convertirla a JSON. En un archivo de Compose con muchas anclas y claves de fusión, el JSON ya expandido permite ver de un vistazo qué valores recibe realmente cada servicio.
- Comprobar las trampas antes de leer: incluso el mismo YAML cambia de significado si el programa que lo lee sigue YAML 1.1: no pasa a ser false y 0755 pasa a ser 493. La revisión de interpretación que aparece más abajo permite ver si tu archivo contiene valores así antes de desplegarlo.
Cómo se usa
- Pega el texto en el panel que corresponda a lo que tienes, JSON o YAML. Si abres un archivo .json, .yaml o .yml con el botón Abrir o arrastrándolo, se coloca en el panel que corresponde a la extensión.
- El resultado aparece enseguida en el otro panel. Si editas el panel del resultado, ese panel pasa a ser el original y el primero se vuelve a generar.
- Al elegir una línea, se ilumina en el otro panel la línea con el mismo valor; cuando los paneles están uno al lado del otro, se dibuja una línea de conexión entre ambas. Si te desplazas en un panel, el otro se mueve a la misma posición.
- Con las opciones que hay encima de los paneles eliges la sangría (JSON: 2 espacios, 4 espacios o minificado; YAML: 2 o 4 espacios), la versión de YAML con la que se interpreta (1.2 o 1.1) y si una matriz se divide en varios documentos YAML.
- Con los botones de debajo de los paneles puedes copiar el contenido o guardarlo como archivo. Si el archivo que abriste era
app.yaml, el JSON se guarda comoapp.json.
Valores que YAML 1.1 y 1.2 interpretan de forma distinta
YAML decide el tipo de un valor sin comillas según su aspecto, y esas reglas cambian de una versión a otra. El esquema Core de YAML 1.2 solo admite como booleanos true y false (con algunas variantes de mayúsculas y minúsculas) y solo acepta el prefijo 0o para el octal. Las reglas de tipos de YAML 1.1, anteriores, leen yes, no, on, off, y y n como booleanos, los enteros que empiezan por 0 como octales, los números unidos con dos puntos como base 60 y todo lo que tiene la forma 2024-03-01 como una fecha. En cambio, la regla de los números reales de 1.1 exige un punto decimal, de modo que 1e5 es una cadena en 1.1.
El problema es que todavía hay muchos programas que leen YAML a la manera de 1.1. PyYAML, de Python, se presenta como un intérprete completo de YAML 1.1. El paquete yaml v3 de Go sigue en su mayor parte la versión 1.2, pero lee y escribe el octal como 0777, igual que 1.1, y acepta yes, no, on y off como booleanos solo cuando se decodifican en un tipo booleano. La documentación de Kubernetes también indica que para los valores booleanos se usen solo true o false, y no yes, no, on ni off, y que se entrecomillen los valores que parezcan booleanos. La documentación de Docker Compose, por su parte, indica que los puertos con el formato HOST:CONTAINER se escriban siempre como cadenas entrecomilladas para que no choquen con la base 60 de YAML.
| Valor sin comillas | YAML 1.2 Core | YAML 1.1 | Resultado de JSON → YAML |
|---|---|---|---|
true | booleano true | booleano true | "true" |
yes | cadena "yes" | booleano true | "yes" |
no | cadena "no" | booleano false | "no" |
on | cadena "on" | booleano true | "on" |
NO | cadena "NO" | booleano false | "NO" |
y | cadena "y" | booleano true | "y" |
~ | null | null | "~" |
0755 | número 755 | número 493 (octal) | "0755" |
0o17 | número 15 (octal) | cadena "0o17" | "0o17" |
12:30 | cadena "12:30" | número 750 (base 60) | "12:30" |
2222:22 | cadena "2222:22" | número 133342 (base 60) | "2222:22" |
8080:80 | cadena "8080:80" | cadena "8080:80" | 8080:80 |
1e5 | número 1e5 | cadena "1e5" | "1e5" |
1_000 | cadena "1_000" | número 1000 | "1_000" |
2024-03-01 | cadena "2024-03-01" | fecha | "2024-03-01" |
La última columna muestra cómo se escribe en YAML un valor que en JSON era una cadena. Si en alguna de las dos versiones podría leerse como algo distinto de una cadena, se entrecomilla con comillas dobles. 8080:80 no necesita comillas porque el 80 que sigue a los dos puntos supera un dígito de base 60 (de 0 a 59), así que en ambas versiones es una cadena; en cambio, un puerto como 2222:22, cuyo segundo número es 59 o menos, se convierte en número en 1.1.
Cuando el panel de YAML es el original, la revisión de interpretación que aparece debajo busca todos los valores del documento que las dos versiones interpretan de forma distinta y los muestra con su número de línea. Al pulsar una ficha, se salta a esa línea. Si cambias la versión de interpretación a 1.1, el resultado JSON también se vuelve a generar con las reglas de 1.1, de modo que puedes ver de antemano los valores que recibiría realmente un programa como PyYAML.
Qué pasa con lo que solo existe en YAML
| YAML | Resultado en JSON |
|---|---|
Comentario # … | No se incluye. La línea de estado indica cuántos hay |
Ancla &base y alias *base | En el lugar del alias se expande el valor del ancla |
Clave de fusión <<: *base | Las claves importadas se fusionan en ese mapeo. Si una clave está escrita directamente, se conserva su valor |
Varios documentos --- | Una matriz con un elemento por documento |
Cadena en bloque |, > | Una cadena con los saltos de línea como \n (> une las líneas con un espacio) |
Etiqueta personalizada como !Ref | Se quita la etiqueta y se conserva solo el valor. Se indica en la revisión de interpretación |
Clave numérica 1: a | Clave de cadena "1" |
Mapeo con [ ] o { } como clave | Error. Las claves de JSON solo pueden ser cadenas |
.inf, .nan | Error. Los números de JSON no tienen infinito ni NaN |
Al convertir JSON a YAML se respeta el orden de las claves tal como se escribieron. El intérprete de JSON que traen los navegadores mueve al principio del objeto las claves con forma de entero, como "2024", así que este conversor lee el JSON con un intérprete propio que conserva el orden. Las cadenas con saltos de línea se escriben como un bloque |, y los objetos y las matrices vacíos se escriben como {} y [].
Los números se copian tal como están escritos
La especificación de JSON (RFC 8259) explica que las implementaciones intercambian números sin problemas cuando no esperan más precisión que la de los números de doble precisión IEEE 754 binary64. Los navegadores tratan los números de ese modo, así que un conversor corriente convierte 9007199254740993 en 9007199254740992 y 4.50 en 4.5. Este conversor no calcula con los números, sino que copia los dígitos tal como están escritos, por lo que no ocurre ninguno de esos cambios. Solo las notaciones que JSON no tiene, como 0o17 o 0x1F en el lado de YAML, se convierten en el mismo valor en decimal.
Hay una excepción. El número JSON 1e5 es un número en YAML 1.2, pero en YAML 1.1 no tiene punto decimal y es una cadena. Por eso, al convertir de JSON a YAML, la notación exponencial se escribe con punto decimal y signo, como 1.0e+5. Ambas versiones leen eso como el número 100000. La revisión de interpretación señala los números reescritos.
Errores frecuentes
- Tabuladores en la sangría: la especificación de YAML prohíbe los tabuladores en la sangría porque cada sistema los trata de forma distinta. Sustituye los tabuladores por espacios en tu editor.
- Sin espacio tras los dos puntos:
port:8080es una sola cadena, no una clave. Entre la clave y el valor tiene que haber un espacio después de los dos puntos, como enport: 8080. - La misma clave dos veces: la especificación de YAML exige que las claves de un mapeo sean únicas, y la de JSON advierte de que el comportamiento de un programa que recibe un objeto con nombres repetidos es impredecible. Este conversor avisa de una clave repetida como error en cualquiera de los dos casos. Las claves YAML
1:y"1":también chocan, porque en JSON son la misma clave. - Sintaxis laxa de JSON: una coma después del último elemento, las comillas simples, las claves sin comillas y los comentarios
//no son JSON estándar. Si tu configuración está escrita en JSON5 o JSONC, corrige esos detalles antes de pegarla. - La clave on: en GitHub Actions: la clave
on:de un flujo de trabajo es la cadena "on" en YAML 1.2, pero un intérprete a la manera de 1.1 la lee como el booleano true. Por eso la clave parece desaparecer cuando lees un archivo de flujo de trabajo con un script de Python y lo modificas. - Valores con aspecto de hora o de puerto:
18:30y2222:22son números de base 60 en 1.1. Es más seguro entrecomillar las horas y los puertos.
Límites y precauciones
- Se convierten entradas de hasta 5 MB (5.242.880 bytes) y resultados de hasta 10 MB. Se pueden abrir archivos UTF-8 (con o sin BOM) y archivos UTF-16 con BOM.
- Los comentarios de YAML, el estilo de las comillas y las líneas en blanco no se conservan al volver a generar el YAML. Si usas YAML como original y luego editas el panel de JSON, el YAML se escribe de nuevo, así que un YAML que tenía comentarios puede recuperarse una vez con Deshacer en la línea de estado.
- Las etiquetas personalizadas, como
!Refde CloudFormation, se quitan y se conserva solo el valor. No se convierten a la forma{"Ref": …}que CloudFormation usa en JSON. - Si los alias se expanden hasta una cantidad excesiva de datos (un alias que apunta a un grupo de alias, y así sucesivamente), la conversión se detiene para evitar el agotamiento de recursos.
- La interpretación de YAML 1.1 sigue las reglas de tipos de 1.1 de yaml.org. Algunos casos límite difieren de los programas reales al estilo de 1.1. Por ejemplo, y y n son booleanos según esas reglas, pero PyYAML los lee como cadenas. El resultado de JSON → YAML entrecomilla todos esos valores, así que siguen siendo cadenas se lean como se lean.
- La conversión solo trata la sintaxis. Si los nombres de clave y los tipos de valor se corresponden con lo que exigen Kubernetes o Compose, conviene comprobarlo con el comando de validación de cada herramienta.
Fuentes
- 01YAML — YAML Ain't Markup Language version 1.2.2§1.2 objetivo principal: ser un superconjunto estricto de JSON, §3.2.1.1 las claves del mapeo son únicas, §6.1 sin tabuladores en la sangría, §10.3.2 esquema Core (tabla de resolución de null, bool, int y float) — comprobado el 2026-10-20
- 02Tipos de YAML 1.1 — Boolean, Integer, Floating-Point, Timestamp, Merge Keyreglas de bool (y, yes, on, etc.), int (octal 0…, base 60), float (punto decimal obligatorio, el exponente lleva signo), timestamp y merge (<<) — junto con type/int.html, float.html, timestamp.html y merge.html
- 03IETF — RFC 8259: The JavaScript Object Notation (JSON) Data Interchange Format§4 los nombres DEBERÍAN ser únicos y con nombres repetidos el comportamiento es impredecible, §6 precisión binary64 e interoperabilidad, §8.1 UTF-8
- 04Kubernetes — Configuration OverviewEscribir la configuración en YAML en lugar de JSON, usar solo true y false como booleanos, evitar yes, no, on y off, entrecomillar los valores que parezcan booleanos
- 05Docker Docs — Compose file reference: services (ports)Escribir siempre HOST:CONTAINER como cadena entrecomillada para que no choque con la base 60 de YAML
- 06Docker Docs — FragmentsArchivos de Compose que usan anclas (&), alias (*) y el tipo de fusión de YAML (<<)
- 07go-yaml v3 READMEAdmite en su mayor parte YAML 1.2, los booleanos de 1.1 solo al decodificar en un tipo booleano, octal como 0777 igual que 1.1
- 08PyPI — PyYAML"complete YAML 1.1 parser"
- 09Documentación de yaml (JavaScript)El intérprete que usa este conversor (2.9.1, ISC). Límite de expansión de alias; la clave de fusión es una función de 1.1 que no está en la especificación 1.2
- 10GitHub Docs — Workflow syntax for GitHub ActionsLos archivos de flujo de trabajo usan sintaxis YAML, con extensión .yml o .yaml
Preguntas frecuentes
¿Por qué al convertir JSON a YAML algunos valores llevan comillas?
Valores como "no", "on", "0012", "18:30" y "2024-03-01" se leerían en YAML como booleanos, números o fechas, y no como cadenas, si no tuvieran comillas, por eso se entrecomillan con comillas dobles. Así, un valor que en JSON era una cadena sigue siendo una cadena en YAML; el valor en sí no cambia.
¿Qué diferencia hay entre YAML 1.1 y 1.2?
Usan reglas distintas para decidir el tipo de un valor sin comillas. En el esquema Core de 1.2 los únicos booleanos son true y false, así que yes, no, on y off son cadenas. YAML 1.1 también lee como booleanos yes, no, on, off, y y n, lee 0755 como el octal 493, 12:30 como el número de base 60 750 y 2024-03-01 como una fecha. PyYAML es un intérprete de YAML 1.1.
¿Se pasan los comentarios de YAML a JSON?
No. JSON no tiene sintaxis de comentarios. La línea de estado indica cuántos comentarios se han quedado fuera, y si estabas usando YAML como original y editaste el panel de JSON, de modo que el YAML se ha vuelto a generar, el botón Deshacer recupera el YAML original.
¿Qué pasa con las anclas (&) y las claves de fusión (<<)?
Un alias (*) se expande al valor al que apunta su ancla, y una clave de fusión incorpora en ese lugar las claves del mapeo importado. Si ya existe la misma clave, se conserva el valor escrito directamente en ese mapeo. JSON no tiene sintaxis de referencias, así que el mismo valor se repite en todos los sitios donde se usa.
¿Qué pasa con varios documentos separados por ---?
Si hay dos o más documentos, se obtiene una matriz JSON con un elemento por documento. En sentido contrario, activa el interruptor «Matriz = documentos (---)» para escribir cada elemento de una matriz JSON de nivel superior como un documento independiente en el panel de YAML.
¿Se conservan los números grandes y valores como 4.50?
Los números se copian tal como están escritos, así que un entero grande como 9007199254740993 y el cero final de 4.50 no cambian. La notación exponencial como 1e5 se escribe como 1.0e+5 para que YAML 1.1 también la lea como número. Si el programa que lee el resultado convierte los números a doble precisión, ese programa puede redondear un entero grande.
¿Dónde tengo que corregir un error?
La línea de ruta muestra el panel con el error, la línea, la columna y el motivo, y se resalta el número de línea. Las causas habituales son los tabuladores en la sangría, la falta de un espacio después de los dos puntos, y en JSON una coma final, comillas simples o un comentario. Si pegaste YAML en el panel de JSON, aparece el botón «Pasar al panel de YAML».
¿Mi archivo de configuración se envía a un servidor?
No. La conversión se hace únicamente en tu navegador y lo que escribes y tus archivos no se envían a ningún servidor. Tampoco se guarda nada en la barra de direcciones ni en el almacenamiento del navegador, así que una configuración con contraseñas o tokens no sale de esta pantalla.