← Volver al Blog

JSON vs YAML: Comparación Completa y Cuándo Usar Cada Uno

Compara JSON y YAML en sintaxis, rendimiento y casos de uso. Aprende cuándo usar cada formato con ejemplos prácticos.

Big JSON Team12 min de lecturaComparaciones
B

Big JSON Team

Technical Writer

Expert in JSON data manipulation, API development, and web technologies. Passionate about creating tools that make developers' lives easier.

12 min lectura

# JSON vs YAML: Comparación Completa y Cuándo Usar Cada Uno

JSON y YAML son dos formatos populares para intercambio de datos. Esta guía completa te ayudará a entender las diferencias y elegir el formato adecuado para tu proyecto.

¿Qué es YAML?

YAML (YAML Ain't Markup Language) es un formato de serialización de datos legible para humanos, comúnmente usado para archivos de configuración.

Características de YAML

  • ✅ Sintaxis limpia basada en indentación
  • ✅ Soporta comentarios
  • ✅ Referencias y anclas
  • ✅ Múltiples documentos en un archivo
  • ✅ Tipos de datos complejos nativos

Comparación de Sintaxis

Objeto Simple

JSON:
{

"nombre": "Ana García",

"edad": 28,

"ciudad": "Madrid",

"activo": true

}

YAML:
nombre: Ana García

edad: 28

ciudad: Madrid

activo: true

Ganador: YAML - Más limpio y conciso

Arrays

JSON:
{

"frutas": ["manzana", "banana", "naranja"],

"numeros": [1, 2, 3, 4, 5]

}

YAML:
frutas:

- manzana

- banana

- naranja

# O en línea

numeros: [1, 2, 3, 4, 5]

Ganador: Empate - YAML ofrece dos estilos

Objetos Anidados

JSON:
{

"usuario": {

"nombre": "Carlos López",

"contacto": {

"email": "carlos@ejemplo.com",

"telefono": "+34600123456"

},

"direccion": {

"calle": "Calle Mayor 123",

"ciudad": "Barcelona",

"pais": "España"

}

}

}

YAML:
usuario:

nombre: Carlos López

contacto:

email: carlos@ejemplo.com

telefono: +34600123456

direccion:

calle: Calle Mayor 123

ciudad: Barcelona

pais: España

Ganador: YAML - Más fácil de leer

Comentarios

JSON:
{

"nombre": "Ana",

"edad": 28

}

❌ JSON no soporta comentarios nativamente

YAML:
# Información del usuario

nombre: Ana # Nombre completo

edad: 28 # Edad en años

✅ YAML soporta comentarios

Ganador: YAML

Strings Multilínea

JSON:
{

"descripcion": "Esta es una descripción\nmuy larga que ocupa\nmúltiples líneas"

}

YAML:
# Preserva saltos de línea

descripcion: |

Esta es una descripción

muy larga que ocupa

múltiples líneas

# Pliega líneas largas

resumen: >

Este texto largo

será plegado en

una sola línea

Ganador: YAML - Más legible

Características Únicas de YAML

Anclas y Referencias

# Definir ancla

default_settings: &defaults

timeout: 30

retries: 3

verbose: true

# Reutilizar con alias

desarrollo:

<<: defaults

debug: true

produccion:

<<: defaults

debug: false

timeout: 60

Equivalente JSON:
{

"default_settings": {

"timeout": 30,

"retries": 3,

"verbose": true

},

"desarrollo": {

"timeout": 30,

"retries": 3,

"verbose": true,

"debug": true

},

"produccion": {

"timeout": 60,

"retries": 3,

"verbose": true,

"debug": false

}

}

Múltiples Documentos

---

nombre: Documento 1

tipo: configuracion

---

nombre: Documento 2

tipo: datos

---

nombre: Documento 3

tipo: metadata

JSON requeriría un array o múltiples archivos.

Tipos de Datos Complejos

# Fechas

fecha: 2024-01-15

datetime: 2024-01-15T10:30:00Z

# Null

valor_nulo: null

valor_vacio: ~

# Booleanos (múltiples formas)

activo: true

habilitado: yes

visible: on

# Números

entero: 42

flotante: 3.14

cientifico: 1.23e+10

infinito: .inf

# Binary

imagen: !!binary |

R0lGODlhDAAMAIQAAP//9/X

17unp5WZmZgAAAOfn515eXv

Comparación de Rendimiento

Velocidad de Parsing

JSON:
  • ✅ Parsing muy rápido
  • ✅ Nativamente soportado en navegadores
  • ✅ Librerías optimizadas en todos los lenguajes

YAML:
  • ❌ Parsing más lento (3-10x que JSON)
  • ❌ Requiere librerías externas
  • ⚠️ Mayor complejidad de parsing

Tamaño de Archivo

Ejemplo - Configuración:
JSON:  847 bytes

YAML: 623 bytes (26% más pequeño)

Ejemplo - Datos:
JSON:  2.4 KB

YAML: 2.1 KB (12% más pequeño)

Ganador: YAML generalmente más compacto

Uso de Memoria

JSON:
  • Menor overhead de parsing
  • Estructuras más simples

YAML:
  • Mayor uso de memoria durante parsing
  • Estructuras más complejas (anclas, referencias)

Casos de Uso

Cuándo Usar JSON

1. APIs REST
{

"status": "success",

"data": {

"usuarios": [...]

}

}

2. Almacenamiento de Datos
{

"id": 1,

"timestamp": "2024-01-15T10:30:00Z",

"evento": "login"

}

3. Configuración de JavaScript
// package.json

{

"name": "mi-proyecto",

"version": "1.0.0",

"dependencies": {...}

}

4. Transmisión de Datos
  • Respuestas de APIs
  • WebSockets
  • Comunicación microservicios

Ventajas:
  • ✅ Parsing muy rápido
  • ✅ Soporte nativo en navegadores
  • ✅ Ampliamente compatible
  • ✅ Seguro (menos features = menos vulnerabilidades)

Cuándo Usar YAML

1. Configuración de Aplicaciones
# config.yaml

servidor:

puerto: 8080

host: localhost

ssl:

habilitado: true

certificado: /path/to/cert.pem

2. Docker Compose
version: '3.8'

services:

web:

image: nginx:latest

ports:

- "80:80"

volumes:

- ./html:/usr/share/nginx/html

3. Kubernetes
apiVersion: v1

kind: Pod

metadata:

name: mi-app

spec:

containers:

- name: app

image: mi-app:1.0

4. CI/CD Pipelines
# .github/workflows/deploy.yml

name: Deploy

on:

push:

branches: [main]

jobs:

deploy:

runs-on: ubuntu-latest

steps:

- uses: actions/checkout@v2

- run: npm install

- run: npm run build

Ventajas:
  • ✅ Muy legible
  • ✅ Soporta comentarios
  • ✅ Menos verboso
  • ✅ Reutilización con anclas

Convertir entre JSON y YAML

YAML a JSON (Python)

import yaml

import json

# Leer YAML

with open('config.yaml') as f:

datos = yaml.safe_load(f)

# Escribir JSON

with open('config.json', 'w') as f:

json.dump(datos, f, indent=2)

JSON a YAML (Python)

import yaml

import json

# Leer JSON

with open('datos.json') as f:

datos = json.load(f)

# Escribir YAML

with open('datos.yaml', 'w') as f:

yaml.dump(datos, f, default_flow_style=False)

Node.js

const yaml = require('js-yaml');

const fs = require('fs');

// YAML a JSON

const yamlContent = fs.readFileSync('config.yaml', 'utf8');

const obj = yaml.load(yamlContent);

fs.writeFileSync('config.json', JSON.stringify(obj, null, 2));

// JSON a YAML

const jsonContent = fs.readFileSync('datos.json', 'utf8');

const data = JSON.parse(jsonContent);

const yamlStr = yaml.dump(data);

fs.writeFileSync('datos.yaml', yamlStr);

Herramientas Online

yq (Procesador YAML)
# YAML a JSON

yq eval -o=json config.yaml > config.json

# JSON a YAML

yq eval -P datos.json > datos.yaml

Seguridad

Vulnerabilidades de YAML

1. Ejecución de Código Arbitrario
# ¡PELIGROSO! No usar yaml.load()

!!python/object/apply:os.system

args: ['rm -rf /']

Solución:
# ✅ Usar safe_load

datos = yaml.safe_load(contenido)

# ❌ NUNCA usar load sin SafeLoader

# datos = yaml.load(contenido) # PELIGROSO

2. Bomb YAML (DoS)
a: &a ["lol","lol","lol","lol","lol","lol","lol","lol","lol"]

b: &b [a,a,a,a,a,a,a,a,a]

c: &c [b,b,b,b,b,b,b,b,b]

# Continúa expandiéndose exponencialmente

Mitigación:
  • Limitar profundidad de anidación
  • Limitar tamaño de archivo
  • Usar parsers seguros

Seguridad de JSON

JSON es más seguro por diseño:

  • ✅ No permite ejecución de código
  • ✅ Sintaxis más simple
  • ✅ Menos superficie de ataque

Precaución:
// ❌ NUNCA usar eval

// const obj = eval('(' + jsonString + ')');

// ✅ Usar JSON.parse

const obj = JSON.parse(jsonString);

Ecosistema y Herramientas

JSON

Validadores:
  • JSONLint
  • Big JSON Viewer
  • VS Code (nativo)

Procesadores:
  • jq (CLI)
  • JSONPath
  • jmespath

Esquemas:
  • JSON Schema
  • Ajv (validador)

YAML

Validadores:
  • yamllint
  • YAML Lint Online
  • VS Code (extensiones)

Procesadores:
  • yq (CLI)
  • yaml-cpp
  • PyYAML

Esquemas:
  • JSON Schema (compatible)
  • Kwalify
  • Rx

Tabla Comparativa

| Característica | JSON | YAML |

|----------------|------|------|

| Legibilidad | Buena | Excelente |

| Velocidad | Muy rápida | Moderada |

| Complejidad | Baja | Media-Alta |

| Comentarios | ❌ No | ✅ Sí |

| Soporte nativo navegadores | ✅ Sí | ❌ No |

| Tamaño archivo | Medio | Pequeño |

| Curva aprendizaje | Baja | Media |

| Reutilización (anclas) | ❌ No | ✅ Sí |

| Strings multilínea | Limitado | ✅ Excelente |

| Seguridad | Alta | Media (cuidado) |

| Uso APIs | ✅✅✅ | ❌ |

| Archivos config | ✅ | ✅✅✅ |

Mejores Prácticas

Para JSON

1. Usa Formateo Consistente
# Formatear con jq

jq . datos.json > datos_formateado.json

2. Valida con Schemas
{

"$schema": "http://json-schema.org/draft-07/schema#",

"type": "object",

"required": ["nombre", "edad"]

}

3. Comprime para Transmisión
gzip datos.json

Para YAML

1. Usa Indentación Consistente
# ✅ Bueno - 2 espacios

usuario:

nombre: Ana

edad: 28

# ❌ Malo - Tabulaciones mezcladas

usuario:

nombre: Ana

edad: 28

2. Evita Ambigüedades
# ✅ Explícito

version: "1.10" # String, no número

# ❌ Ambiguo

version: 1.10 # Podría ser 1.1

3. Usa safe_load
# ✅ Seguro

yaml.safe_load(contenido)

# ❌ Inseguro

yaml.load(contenido)

Conclusión

Elige JSON cuando:
  • Necesites máxima velocidad
  • Estés desarrollando APIs
  • Requieras compatibilidad universal
  • La seguridad sea crítica

Elige YAML cuando:
  • Escribas archivos de configuración
  • La legibilidad sea prioritaria
  • Necesites comentarios
  • Trabajes con DevOps/Kubernetes

Recomendación General

  • Datos en tránsito: JSON
  • Configuración: YAML
  • Almacenamiento: Depende del caso
  • APIs: JSON
  • CI/CD: YAML

¡Ambos formatos tienen su lugar en el desarrollo moderno!

Share:

Artículos Relacionados

Read in English