jsonyamlconfiguration

JSON vs YAML: ¿Cuándo usar cada formato?

· Cosyslabs

JSON es la elección correcta para APIs, intercambio de datos y configuración generada por máquinas. YAML es mejor para archivos de configuración escritos por humanos donde los comentarios, la legibilidad y la puntuación mínima son importantes. YAML es un superconjunto de JSON — todo documento JSON válido es YAML válido, pero YAML tiene trampas significativas que debes conocer antes de adoptarlo.

Comparación de sintaxis

// JSON
{
  "servidor": {
    "host": "localhost",
    "puerto": 8080,
    "tls": true
  },
  "baseDeDatos": {
    "url": "postgres://localhost/mibd",
    "pool": {
      "min": 2,
      "max": 10
    }
  },
  "caracteristicas": ["auth", "api", "admin"]
}
# YAML — los mismos datos, más legibles
servidor:
  host: localhost
  puerto: 8080
  tls: true

baseDeDatos:
  url: postgres://localhost/mibd
  pool:
    min: 2
    max: 10

caracteristicas:
  - auth
  - api
  - admin

YAML elimina comillas, llaves, corchetes y comas. Usa sangría (solo espacios — sin tabulaciones) para transmitir la estructura.

YAML es un superconjunto de JSON

Puedes incrustar JSON directamente en un archivo YAML y es válido:

# Esto es YAML válido
nombre: Alice
config: {"debug": true, "nivel": 3}

Esto significa que los analizadores YAML pueden analizar JSON, y los conversores YAML-a-JSON son sin pérdida (excepto para características específicas de YAML como anclas y comentarios, que JSON no puede representar).

Dónde JSON gana

Respuestas de API

JSON es la lengua franca de las APIs REST. Cada cliente HTTP, desde curl hasta el navegador fetch, maneja JSON de forma nativa:

const respuesta = await fetch("/api/usuarios");
const datos = await respuesta.json(); // Análisis JSON integrado

YAML no tiene soporte nativo en el navegador y añade una dependencia de analizador (~15 KB para js-yaml).

Manejo estricto de tipos

JSON tiene tipos explícitos: cadena, número, booleano, null, arreglo, objeto. YAML infiere tipos de los valores, lo que causa errores notorios.

Datos generados por máquinas

Los programas que generan configuración o datos deben emitir JSON. JSON es inequívoco, ampliamente soportado y no depende del espacio en blanco.

Ecosistema JavaScript

package.json, tsconfig.json, eslintrc.json — las herramientas de JavaScript estandarizaron en JSON. Los editores proporcionan validación de JSON Schema con autocompletado y detección de errores.

Dónde YAML gana

Configuración escrita por humanos

# YAML permite comentarios — JSON no
# Este comentario explica por qué el timeout es alto
servidor:
  timeout: 30000  # milisegundos — los clientes heredados necesitan más tiempo

# Las cadenas multilínea son legibles en YAML
mensaje: |
  Bienvenido al sistema.
  Tu cuenta ha sido creada.
  Por favor verifica tu correo electrónico.

Kubernetes, GitHub Actions, Docker Compose

El ecosistema nativo de la nube estandarizó en YAML para manifiestos y pipelines:

# Flujo de trabajo de GitHub Actions
name: CI
on: [push, pull_request]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm test

Cadenas multilínea

YAML maneja cadenas multilínea elegantemente con escalares de bloque:

# Escalar de bloque literal — preserva saltos de línea
descripcion: |
  Línea uno.
  Línea dos.
  Línea tres.

# Escalar de bloque plegado — los saltos de línea se convierten en espacios
resumen: >
  Este texto largo será
  plegado en una sola línea
  al ser analizado.

JSON requiere \n escapado:

{
  "descripcion": "Línea uno.\nLínea dos.\nLínea tres."
}

Trampas de YAML (El problema de Noruega y otros)

La inferencia de tipos de YAML ha causado incidentes reales en producción.

El problema de Noruega

paises:
  - GB
  - DE
  - NO   # YAML 1.1 analiza esto como booleano false!
  - SE

En YAML 1.1 (usado por muchos analizadores antiguos), no, NO, No se analizan como false. De manera similar, yes, YES, Yes se convierten en true. YAML 1.2 (2009) elimina este comportamiento, pero muchos analizadores todavía implementan 1.1.

Solución: Poner entre comillas los valores que podrían ser mal interpretados:

paises:
  - "GB"
  - "DE"
  - "NO"   # Ahora de forma segura una cadena
  - "SE"

Análisis de números octales

permisos_archivo: 0777  # YAML 1.1: ¡se analiza como octal 511, no decimal 777!
puerto: 0755             # octal 493

En YAML 1.2, los ceros iniciales no implican octal. En 1.1, sí. Pon entre comillas los valores numéricos donde la precisión importa.

Errores de sangría

YAML usa solo espacios — mezclar tabulaciones y espacios causa errores del analizador:

servidor:
  host: localhost
	puerto: 8080  # TABULACIÓN aquí — ¡error de análisis YAML!

Claves duplicadas

config:
  debug: true
  debug: false  # ¿Cuál gana? Comportamiento indefinido

Diferentes analizadores manejan las claves duplicadas de manera diferente (gana el último, gana el primero, o error).

Conversión

// YAML a JSON (Node.js)
import yaml from "js-yaml";
import fs from "fs";

const contenidoYaml = fs.readFileSync("config.yaml", "utf8");
const analizado = yaml.load(contenidoYaml);
const json = JSON.stringify(analizado, null, 2);
import yaml, json

with open("config.yaml") as f:
    datos = yaml.safe_load(f)  # ¡Usar safe_load, no load!

print(json.dumps(datos, indent=2))

Siempre usa yaml.safe_load() en Python, nunca yaml.load(). La versión insegura puede ejecutar código Python arbitrario mediante deserialización YAML — un conocido vector de RCE.

Guía de decisión

SituaciónElegir
Respuestas de API RESTJSON
gRPC / Protocol BuffersNinguno (binario)
package.json, tsconfig.jsonJSON
Manifiestos de KubernetesYAML
GitHub Actions / CIYAML
Docker ComposeYAML
Playbooks de AnsibleYAML
Config donde se necesitan comentariosYAML
Config generada por máquinasJSON
Config escrita por humanosYAML
Datos con muchas cadenasYAML (sin necesidad de comillas)

Pruébalo ahora

Convierte entre JSON y YAML al instante con la Herramienta Formateador JSON y la Herramienta Formateador YAML — ambas se ejecutan completamente en tu navegador.

Más herramientas de Cosyslabs

  • PDF Convert All — Convierte, fusiona y comprime PDFs. Muchos pipelines de generación de documentos consumen configuración JSON o YAML.
  • Unit Convert All — Convierte valores de medidas que suelen encontrarse en archivos de configuración (p. ej., timeouts en ms, tamaños de archivo en MB).
  • Rough Estimator — Estima el esfuerzo de migrar sistemas de configuración basados en JSON a YAML (o viceversa) en una base de código grande.
  • Cosyslabs — El estudio detrás de Dev Tools !, Routine Toolkit, y más.