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 Team
• Technical WriterExpert in JSON data manipulation, API development, and web technologies. Passionate about creating tools that make developers' lives easier.
# 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: YAMLStrings 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
- ❌ 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
- 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
- ✅ 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
// ❌ 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)
- jq (CLI)
- JSONPath
- jmespath
- JSON Schema
- Ajv (validador)
YAML
Validadores:- yamllint
- YAML Lint Online
- VS Code (extensiones)
- yq (CLI)
- yaml-cpp
- PyYAML
- 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
- 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!
Artículos Relacionados
¿Qué es JSON? Guía Completa para Principiantes
Descubre qué es JSON, por qué es importante y cómo funciona. Una guía completa para principiantes sobre el formato de datos más popular de la web.
JSON vs XML: Comparación Completa para Desarrolladores
Comparación detallada entre JSON y XML: diferencias de sintaxis, casos de uso, ventajas y desventajas para ayudarte a elegir el formato correcto.
Cómo Formatear JSON: Guía Completa de Pretty Print y Minificación
Aprende a formatear JSON correctamente con técnicas de pretty printing, minificación y herramientas. Incluye ejemplos en JavaScript, Python y herramientas en línea.