JSON y YAML: los mismos datos, dos estilos
JSON y YAML pueden describir lo mismo: objetos (en YAML se llaman mapeos), listas, cadenas, números, booleanos y null. JSON usa llaves, corchetes, comillas y comas. YAML usa sangría y guiones, lo que lo hace más corto y más fácil de leer y de editar a mano. Por eso herramientas como Kubernetes, Docker Compose, GitHub Actions y Ansible usan YAML para la configuración, mientras que las API suelen hablar JSON.
A menudo tienes que pasar de uno a otro. Una API devuelve JSON y lo quieres en un archivo de configuración. O una configuración en YAML tiene que llegar a un programa que solo lee JSON. Este convertidor sirve para convertir JSON a YAML y también YAML a JSON.
Cómo usarlo
- Elige la dirección con el botón JSON a YAML o YAML a JSON.
- Pega tus datos en el cuadro de la izquierda, pulsa Abrir archivo o pulsa Ejemplo. El resultado aparece a la derecha mientras escribes.
- Elige una Sangría de 2 o 4 espacios. En la dirección de YAML a JSON también está la opción Minificado.
- Para JSON a YAML, activa Ordenar claves de la A a la Z si quieres las claves en orden alfabético.
- Pulsa Copiar, o Descargar para guardar un archivo
.yamlo.json.
Cuando cambias de dirección, el resultado actual pasa a la entrada, así que puedes convertir de ida y vuelta para comprobar que los datos no cambian.
Ejemplo de JSON a YAML
{"name":"web-app","version":3,"private":true,"ports":[80,443],"database":{"host":"localhost","password":null},"tags":["api","v2"]}
se convierte en:
name: web-app
version: 3
private: true
ports:
- 80
- 443
database:
host: localhost
password: null
tags:
- api
- v2
Comillas seguras
Algunas cadenas parecen otros tipos para un analizador de YAML. El convertidor las pone entre comillas para que sigan siendo cadenas. Este JSON:
{"zip":"02134","enabled":"yes","version":"1.10","note":"a: b","empty":""}
se convierte en:
zip: "02134"
enabled: "yes"
version: "1.10"
note: "a: b"
empty: ""
Sin las comillas, 02134 perdería su cero inicial, 1.10 se convertiría en el número 1.1, y un analizador antiguo de YAML 1.1 (PyYAML y muchas herramientas de CI siguen esas reglas) leería yes como true. El convertidor aplica las reglas de entrecomillado más estrictas para que el resultado se lea igual en analizadores antiguos y nuevos. Las fechas como "2024-01-15" llevan comillas por la misma razón.
Con valores en español pasa algo parecido. El JSON {"activo":"sí","respuesta":"no"} da activo: sí sin comillas, porque “sí” no significa nada especial en YAML, y respuesta: "no" con comillas, porque en YAML 1.1 no se lee como false. Las tildes y la ñ, en claves como año o en valores como Cádiz, se escriben tal cual, sin escapes.
Ejemplo de YAML a JSON
# App settings
name: web-app
ports:
- 80
- 443
debug: false
retries: 3
owner: ~
se convierte en:
{
"name": "web-app",
"ports": [
80,
443
],
"debug": false,
"retries": 3,
"owner": null
}
El comentario desaparece, porque JSON no tiene comentarios, y ~ es la forma abreviada de null en YAML.
Las claves de fusión se resuelven. Este archivo al estilo de Rails:
defaults: &defaults
adapter: postgres
host: localhost
development:
<<: *defaults
database: dev_db
da:
{
"defaults": {
"adapter": "postgres",
"host": "localhost"
},
"development": {
"adapter": "postgres",
"host": "localhost",
"database": "dev_db"
}
}
Dos documentos separados por --- (por ejemplo kind: Service y kind: Deployment) se convierten en un solo array. Con la opción Minificado queda así: [{"kind":"Service"},{"kind":"Deployment"}].
Cómo se leen los valores
La conversión de YAML a JSON usa las reglas de YAML 1.2. Con esas reglas, yes, no y on son cadenas normales, solo true y false son booleanos, y las fechas se quedan como cadenas. Esta entrada:
a: yes
b: no
c: on
d: true
e: 010
f: 0o10
g: 1e3
h: 2024-01-15
se convierte (minificada) en:
{"a":"yes","b":"no","c":"on","d":true,"e":10,"f":8,"g":1000,"h":"2024-01-15"}
Fíjate en que 010 se lee como diez, y 0o10 es la notación octal de ocho.
Si un valor tiene que quedarse como texto, ponlo entre comillas en el YAML. Recuerda también que en YAML, igual que en JSON, el separador decimal es el punto: precio: 2,50 es la cadena “2,50”, no un número.
Consejos para ir y volver sin sorpresas
- Convertir JSON a YAML y de vuelta da los mismos datos, pero no siempre el mismo texto. El orden de las claves se mantiene, salvo que actives Ordenar claves de la A a la Z.
- Los comentarios, las anclas y las etiquetas personalizadas de YAML no tienen equivalente en JSON. Las anclas se expanden en copias completas de los datos.
- Los enteros muy grandes, como los identificadores de 20 dígitos, se mantienen exactos de JSON a YAML cuando el navegador lo permite. De YAML a JSON pasan por los números de JavaScript, así que guarda los identificadores largos como cadenas entre comillas.
- Tus archivos se quedan en tu dispositivo. No se sube nada.
Errores
Los fallos se indican con la línea y la columna, y Mostrar en la entrada te lleva a ellos. Una coma final en JSON da Línea 3, columna 1: No se permite una coma final antes de "}". En YAML, el mensaje viene de la biblioteca y está en inglés: una clave repetida da Map keys must be unique, y las tabulaciones usadas como sangría se rechazan porque YAML solo admite espacios.
Otras formas de convertir
yq. La versión en Go de yq convierte desde la línea de comandos: lee JSON como entrada porque el JSON es YAML válido, y puede imprimir cualquiera de los dos formatos.
Python. Con el paquete PyYAML, yaml.safe_dump(json.load(f)) escribe YAML a partir de un archivo JSON. PyYAML sigue YAML 1.1, así que revisa cadenas como yes y no. Para que no escape las tildes y la ñ, añade allow_unicode=True.
VS Code. Varias extensiones añaden comandos para convertir una selección entre JSON y YAML.
Herramientas relacionadas
Para ordenar un archivo YAML sin convertirlo, usa el formateador YAML. Para revisar o dar formato al JSON antes, usa el formateador JSON. Para datos de una hoja de cálculo, empieza con el convertidor de CSV a JSON.