Convertidor de YAML a JSON gratuito

Convierte YAML a JSON al instante. Maneja toda la sintaxis YAML, incluidas listas, mapas y anclas. Se ejecuta completamente en tu navegador.

Tus datos nunca salen de tu dispositivo
Suelta el archivo YAML aquí o haz clic para buscar (máx 5 MB)

¿Qué es YAML?

YAML (YAML Ain’t Markup Language) es un formato de serialización de datos fácil de leer para humanos, diseñado para ser sencillo de leer y escribir. Se utiliza ampliamente para archivos de configuración, pipelines CI/CD e intercambio de datos entre lenguajes de programación.

¿Por qué convertir YAML a JSON?

Preguntas frecuentes

¿Qué características de YAML son compatibles?

El convertidor admite todas las características estándar de YAML 1.2, incluidos mapas, listas, tipos escalares (cadenas, números, booleanos, null), anclas y alias, documentos múltiples y estructuras anidadas.

¿Mi estructura YAML compleja se convertirá correctamente?

Sí. El convertidor maneja estructuras profundamente anidadas, matrices de objetos, referencias de anclas y tipos de datos mixtos. Si tu YAML es válido, producirá un JSON equivalente que conserva todas las relaciones entre los datos.

¿Se conservan los comentarios YAML?

No. JSON no admite comentarios, por lo que se eliminan durante la conversión. Solo los datos estructurados de tu YAML se convierten al formato JSON.

Una breve historia de YAML, una escisión de una lista de correo de 2001

La prehistoria de YAML comienza en la lista de correo sml-dev, una rama de los años 2000 de xml-dev que reunió a personas que pensaban que XML era excesivo para los datos editados por humanos. Convergieron dos vías paralelas: el módulo de Perl Data::Denter de Ingy döt Net, escrito como formato de serialización para el módulo Inline de Perl, y el trabajo conjunto de Oren Ben-Kiki y Clark Evans orientado a simplificar XML. El 11 de mayo de 2001, Clark Evans publicó «YAML Draft 0.1» en sml-dev, y el formato se dio a conocer públicamente por primera vez en un artículo de xmlhack al día siguiente.

El desarrollo inicial de las siglas era irónico: Yet Another Markup Language, una pulla a la proliferación de formatos de marcado en 2001. Entre diciembre de 2001 y abril de 2002, los autores adaptaron el retroacrónimo recursivo YAML Ain't Markup Language: en parte para subrayar que YAML es un formato de serialización de datos y no un formato de marcado de documentos como XML o HTML, y en parte porque la broma había envejecido. El desarrollo recursivo sigue siendo hoy el lema oficial en yaml.org.

Cronología de la especificación

La especificación 1.2.2 es explícita en que «no hay cambios normativos respecto a la especificación de YAML v1.2»; el trabajo consistió en convertir el origen de DocBook a Markdown, regenerar los diagramas a partir de LaTeX en texto plano y abrir el proceso de desarrollo para que los colaboradores externos pudieran presentar pull requests contra la propia especificación. No se ha publicado ningún lenguaje desde 2009: todo error de conformidad de los analizadores desde entonces es o bien un resto de la 1.1 o una desviación de una especificación que lleva ya más de quince años vigente. El tipo MIME oficial application/yaml se finalizó en 2024; las extensiones de archivo .yaml y .yml están reconocidas ambas desde alrededor de 2006, siendo .yaml la recomendada.

La relación con JSON, «casi un superconjunto»

La especificación de YAML 1.2.2 lo expresa con cuidado: «Por pura coincidencia, JSON era casi un subconjunto completo de YAML». JSON apareció entre YAML 1.0 (2004) y YAML 1.1 (2005); los autores de YAML solo descubrieron el solapamiento de forma retroactiva. El objetivo explícito de la revisión 1.2, en sus propias palabras, era «convertir YAML en un superconjunto estricto de JSON», y esto es casi cierto para los documentos de YAML 1.2 con formato JSON, pero no lo es para YAML 1.1.

En términos prácticos: todo documento JSON es YAML 1.2 válido; la asignación en estilo de flujo {"a": 1, "b": [true, null]} se analiza de forma idéntica en ambos. La mayoría de los documentos JSON no son YAML 1.1 válido por las trampas de los booleanos y de Noruega: un documento JSON que contenga la cadena literal "NO" se volvería a emitir como false si se hace una ida y vuelta a través de un analizador 1.1 con la configuración por defecto. Lo contrario nunca es cierto: YAML puede expresar cosas que JSON no puede, comentarios (que se pierden en la conversión), anclas y alias (que se resuelven en la conversión), etiquetas (que normalmente se descartan), flujos de varios documentos (solo sobrevive el primero o todos como matriz) y claves que no son cadenas en las asignaciones.

El Problema de Noruega

La trampa más citada de YAML. Se llama así por Noruega porque el código de país de dos letras ISO 3166-1 de Noruega es NO, y la expresión regular de booleanos de YAML 1.1 reconoce NO como el booleano falso. Escribe country: NO en YAML 1.1 (o en cualquier analizador 1.2 que todavía use por defecto el comportamiento 1.1, que son la mayoría), analízalo, vuélcalo como JSON y obtienes {"country": false}. El error es silencioso: no hay advertencia ni error de tipo, solo corrupción de datos.

La expresión regular completa de booleanos de YAML 1.1 del esquema oficial yaml.org/type/bool.html es:

y|Y|yes|Yes|YES|n|N|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off|OFF

Son seis lexemas (y/n, yes/no, on/off, true/false) con tres variantes de mayúsculas cada uno, veintidós cadenas que se convierten todas en booleanos sin advertencia. Una lista de respuestas válidas [y, n, maybe] se convierte en [true, false, "maybe"]; un indicador de función dark_mode: on se analiza como dark_mode: true; un ajuste de modo de puerto escrito OFF se convierte en false. YAML 1.2 corrigió esto a nivel de especificación: el esquema básico alineado con JSON solo reconoce true, True, TRUE, false, False, FALSE y no reconoce en absoluto y/n/yes/no/on/off. Pero esta corrección no se ha propagado sobre el terreno: PyYAML y LibYAML siguen usando 1.1 por defecto en todas las versiones que se distribuyen actualmente. Este conversor usa js-yaml v4, que usa por defecto el esquema YAML 1.2 / compatible con JSON; es una de las razones por las que un conversor del lado del navegador es en realidad más seguro que ejecutar yaml.load() en PyYAML y convertir desde ahí.

Otras minas del tipado implícito

Números octales. YAML 1.1 seguía la convención de C: un cero inicial significaba octal. Así, 010 se analizaba como el entero 8, y permissions: 0777 (una forma perfectamente natural de escribir un modo de archivo de Unix) se analizaba como 511. La corrección de YAML 1.2 fue exigir un prefijo explícito 0o, igual que el Python moderno: 0o777 es 511 y 0777 es simplemente 777. Los analizadores anclados en los valores por defecto de 1.1 siguen equivocándose en esto.

Números sexagesimales. YAML 1.1 heredó de formatos de serialización anteriores la convención de que cualquier secuencia de grupos de dígitos decimales separados por dos puntos debía analizarse como un entero o un decimal en base 60 (sexagesimal). El caso de uso anunciado eran las duraciones de tiempo: 1:11:00 se analizaría como el entero 4260 (una hora y once minutos expresados en segundos). Esta regla todavía perjudica a la gente en la práctica cuando escribe marcas de tiempo como 21:00 o números de versión como 2:3:4 y se los encuentra coaccionados a enteros en silencio. El sexagesimal se eliminó en silencio en YAML 1.2, pero PyYAML y otros analizadores con 1.1 por defecto todavía lo aplican.

Coacción automática de fechas y horas. YAML 1.1 también detecta automáticamente las marcas de tiempo ISO 8601 y las analiza como el tipo de fecha/hora nativo del lenguaje anfitrión, lo que es un problema si querías una cadena. Escribe version: 2024-01-15 y obtienes un objeto date de Python, no la cadena "2024-01-15". La lección general, machacada por el ensayo «YAML document from hell» de Ruud van Asseldonk: entrecomilla siempre las cadenas que concebiblemente podrían analizarse como otra cosa. Los códigos de país, los números de versión, los modos de archivo, las marcas de tiempo y cualquier valor extraído de un vocabulario fijo deberían ir entre comillas simples o dobles.

Anclas, alias y la clave de fusión

El sistema de anclas/alias de YAML te permite etiquetar un nodo con &name y reutilizarlo más tarde con *name. El ejemplo clásico:

defaults: &defaults
  timeout: 30
  retries: 3
production:
  <<: *defaults
  host: prod.example.com

Aquí &defaults ancla la asignación, y <<: *defaults (la clave de fusión, una función del esquema 1.1 conservada por la mayoría de los analizadores) la empalma en el bloque de producción. Cuando esto se convierte a JSON, el alias se resuelve por completo: la salida JSON contiene el contenido repetido literal, no una referencia. Las anclas y los alias desaparecen, y las claves de fusión se aplanan.

El famoso modo de fallo de este sistema es el ataque de los mil millones de risas (billion laughs): como las anclas pueden tener alias varias veces y los destinos de los alias pueden contener a su vez alias, un archivo YAML pequeño puede expandirse hasta una estructura enorme en memoria (10 niveles × anidamiento de 10 = 10¹⁰ elementos de cadena). PyYAML, LibYAML y otros tuvieron que añadir límites de expansión para mitigarlo. Los conversores del lado del navegador tienen límites de memoria naturales (la pestaña agotará la memoria mucho antes de que sufra el anfitrión), pero el riesgo estructural es real.

Flujos de varios documentos y front matter

Un flujo de YAML puede contener más de un documento. Los documentos se separan con una línea que contiene exactamente --- (también usada como marcador de fin de directivas al principio del primer documento, razón por la cual el front matter en Jekyll, Hugo y Eleventy va delimitado por líneas ---). Una línea que contiene ... marca el final de un documento sin iniciar uno nuevo, útil en los protocolos de streaming.

Kubernetes usa --- para agrupar varios manifiestos de recursos en un solo archivo. JSON no tiene equivalente. Un conversor tiene tres opciones cuando se topa con YAML de varios documentos: emitir solo el primer documento, emitir una matriz JSON de documentos, o emitir un documento JSON por cada --- separados por saltos de línea (JSON Lines). La mayoría de los conversores usan por defecto la primera o la segunda opción; loadAll de js-yaml devuelve una matriz.

Cadenas multilínea, plegada frente a literal

YAML tiene dos estilos de escalar de bloque. El estilo literal (|) conserva los saltos de línea exactamente. El estilo plegado (>) sustituye los saltos de línea simples por espacios y conserva las líneas en blanco como separadores de párrafo. Ambos aceptan indicadores de recorte: |- y >- eliminan todos los saltos de línea finales, |+ y >+ los conservan todos, y el | o > sin modificar («recorte») conserva un único salto de línea final. Cuando se convierten a JSON, ambos estilos producen valores de cadena ordinarios: el bloque plegado se convierte en una larga cadena con \n incrustados solo en las líneas en blanco conservadas; el bloque literal tiene \n en cada salto de línea.

Qué se pierde en la conversión

Dónde se usa YAML en la práctica

YAML está en todas partes en la infraestructura moderna: manifiestos de Kubernetes (todo el modelo de objetos es YAML por convención; los archivos de varios documentos separados por --- son lo estándar), Docker Compose (docker-compose.yml para servicios, redes y volúmenes), GitHub Actions (.github/workflows/*.yml: en su mayor parte se respeta el esquema estricto de YAML 1.2, pero el analizador todavía reconoce on: como clave, un casi accidente del Problema de Noruega que GitHub sortea de forma explícita), GitLab CI/CD, playbooks de Ansible, CircleCI / Travis CI / Drone / Bitbucket Pipelines, el front matter de Jekyll / Hugo / Eleventy / Gatsby / Astro, las especificaciones de OpenAPI / Swagger (oficialmente «un objeto JSON que puede representarse tanto en JSON como en YAML»), la configuración de la pila de monitorización Prometheus / Grafana / Loki / Tempo, cloud-init (aprovisionamiento de primer arranque de máquinas virtuales de EC2/GCE/Azure) y AWS CloudFormation / Azure Resource Manager / Google Cloud Deployment Manager. Para la mayoría de estos, la conversión de YAML a JSON es esencial siempre que estés incrustando configuración en protocolos que solo admiten JSON, comparando archivos con jq o alimentando la salida a una herramienta que espera JSON.

Por qué la conversión del lado del navegador es más segura que la del lado del servidor

yaml.load() de PyYAML con la configuración por defecto podía ejecutar código Python arbitrario con cualquier entrada no confiable a través de la etiqueta !!python/object, que deserializa en objetos Python reales con efectos secundarios: CVE-2017-18342, puntuación CVSS v3.1 de 9,8 (crítica), corregido en PyYAML 5.1 (marzo de 2019) al declarar obsoleto el valor por defecto inseguro y convertir safe_load() en el punto de entrada recomendado. El SnakeYAML de Java tenía su propio equivalente (CVE-2022-1471, también CVSS 9,8) en torno a la clase Constructor, que permitía la instanciación arbitraria. El crate serde_yaml, el de facto de Rust, quedó obsoleto en marzo de 2024; el ecosistema todavía está decidiéndose por un sucesor (serde_yml, serde_yaml_ng, serde_norway).

Ejecutar el análisis en el navegador mediante js-yaml v4 evita todo esto: no hay servidor que comprometer, js-yaml no tiene el concepto de ejecución de código arbitrario mediante etiquetas (las etiquetas desconocidas se convierten en escalares simples en lugar de en objetos construidos) y la v4 usa por defecto el esquema 1.2, más seguro. La herramienta de Absolutool se beneficia de esto por defecto.

Más preguntas

¿Cómo gestiona el conversor los archivos YAML de varios documentos?

Los carga con loadAll de js-yaml, que devuelve una matriz de documentos analizados; por tanto, la salida JSON es una matriz JSON con un elemento por cada documento separado por ---. Si solo tienes un único documento, obtendrás una matriz JSON con un elemento; envuelve tu entrada con marcadores ---/... si quieres una semántica explícita de documento único.

¿Se convertirá correctamente mi manifiesto de Kubernetes?

Casi siempre, sí. Kubernetes usa en su mayor parte contenido compatible con YAML 1.2, y js-yaml v4 maneja todas las primitivas estándar (cadenas, enteros, booleanos, nulos, secuencias, asignaciones) más las anclas y los alias. Las dos piezas que no sobreviven son los comentarios (que se eliminan) y cualquier ancla que se expanda a contenido repetido en lugar de a referencias.

¿Por qué mi código de país NO se lee como un booleano?

No debería serlo en este conversor: js-yaml v4 usa por defecto el esquema YAML 1.2 / compatible con JSON, que no reconoce y/n/yes/no/on/off como booleanos. Si te topas con esto en una herramienta distinta (PyYAML, por ejemplo), la solución es envolver el valor entre comillas: country: "NO".

¿Cuál es el límite de tamaño de archivo?

5 MB en el widget de subida, pero el contenido pegado puede ser mayor si tu navegador tiene memoria suficiente. El cuello de botella es la representación en memoria, no la red: no hay ningún servidor en el proceso. Para archivos de más de ~50 MB, considera mejor una cadena de herramientas de YAML de escritorio (por ejemplo, yq en la línea de comandos).

Herramientas relacionadas