🎯 Objetivo de Aprendizaje
Dominar el formato JSON para estructurar, guardar y manipular datos complejos y anidados en Python, desarrollando pensamiento lógico, atención al detalle y buenas prácticas de programación que permitan construir aplicaciones modernas, robustas y accesibles, preparándote para resolver desafíos reales del desarrollo de software y el manejo de APIs en el ecosistema tecnológico actual.
🌐 ¿Alguna vez te has preguntado cómo funciona tu app del banco?
Imagina que estás desarrollando una aplicación de ecoturismo para las Islas Galápagos. Tu primera usuaria, María, tiene un perfil rico en detalles: ha visitado Santa Cruz, Isabela y San Cristóbal, es vegetariana, lleva una cámara submarina de 1.2 kg y tiene dos reservas de tours con fechas y precios específicos.
Si intentaras guardar esto en una hoja de cálculo tradicional (CSV), te encontrarías con un muro: el CSV solo entiende filas y columnas planas. No sabe qué hacer con una "lista de islas" dentro de una celda, ni con un "diccionario de preferencias" anidado.
Detrás de escena de Instagram, el sistema del IESS en línea o tu videojuego favorito, hay un formato de texto moviendo datos de forma elegante. Hoy aprenderás a dominar ese idioma.
📦 ¿Qué es JSON?
JSON significa JavaScript Object Notation. Es un formato de texto ligero que representa datos estructurados usando dos elementos básicos:
- Objetos (equivalente a diccionarios en Python):
{"clave": "valor"} - Arreglos (equivalente a listas en Python):
["elemento1", "elemento2"]
🐍 La magia: JSON ↔ Python son casi gemelos
| JSON | Python |
|---|---|
{...} (objeto) | dict (diccionario) |
[...] (arreglo) | list (lista) |
"texto" (string) | str (cadena) |
123 (número) | int o float |
true / false | True / False |
null | None |
", y los valores booleanos son true/false (minúsculas). En Python usamos comillas simples o dobles, y True/False (mayúsculas).
🛠️ El módulo json: Tu traductor universal
Python incluye el módulo json que traduce entre diccionarios/listas de Python y texto JSON.
| Función | ¿Qué hace? | Truco para recordar |
|---|---|---|
json.dump(datos, archivo) |
Escribe datos de Python a un archivo JSON | Con archivo → sin "s" |
json.load(archivo) |
Lee datos de un archivo JSON y los convierte a Python | Con archivo → sin "s" |
json.dumps(datos) |
Convierte datos a string JSON | Con string → con "s" (string) |
json.loads(texto) |
Convierte un string JSON a datos de Python | Con string → con "s" (string) |
✍️ Escribir y Leer JSON: Buenas Prácticas
La regla de oro: Siempre usa indent=4 y ensure_ascii=False cuando guardes JSON para que sea legible por humanos y respete el español (tildes y ñ).
Ejemplo: Guardar un perfil simple
# ==========================================
# 1. IMPORTACIONES
# ==========================================
import json
# ==========================================
# 2. VARIABLES
# ==========================================
usuario = {
"nombre": "María López",
"edad": 28,
"ciudad": "Quito"
}
# ==========================================
# 3. PROGRAMA PRINCIPAL
# ==========================================
with open("usuario.json", "w", encoding="utf-8") as archivo:
json.dump(usuario, archivo, indent=4, ensure_ascii=False)
print("✅ Perfil creado exitosamente")
Leyendo el archivo
import json
with open("usuario.json", "r", encoding="utf-8") as archivo:
usuario_leido = json.load(archivo)
print(usuario_leido["nombre"]) # María López
print(type(usuario_leido)) # <class 'dict'>
🎯 Manos a la obra: EcoturGalápagos (Datos Anidados)
A continuación, un sistema completo que demuestra el poder de los datos anidados. Observa cómo las listas y diccionarios conviven en armonía. Este es el núcleo de una aplicación real.
# ==========================================
# 1. IMPORTACIONES
# ==========================================
import json
import os
# ==========================================
# 2. VARIABLES GLOBALES
# ==========================================
ARCHIVO_PERFILES = "perfiles.json"
# ==========================================
# 3. FUNCIONES
# ==========================================
def cargar_perfiles():
if not os.path.exists(ARCHIVO_PERFILES):
return []
try:
with open(ARCHIVO_PERFILES, "r", encoding="utf-8") as archivo:
return json.load(archivo)
except json.JSONDecodeError as e:
print(f"❌ El archivo JSON está mal formado: {e}")
return []
def guardar_perfiles(perfiles):
with open(ARCHIVO_PERFILES, "w", encoding="utf-8") as archivo:
json.dump(perfiles, archivo, indent=4, ensure_ascii=False)
def obtener_siguiente_id():
perfiles = cargar_perfiles()
if not perfiles:
return 1
return max(p["id"] for p in perfiles) + 1
# ==========================================
# 4. PROGRAMA PRINCIPAL (Ejemplo de uso)
# ==========================================
if __name__ == "__main__":
nuevo_perfil = {
"id": obtener_siguiente_id(),
"nombre": "María López",
"islas_visitadas": ["Santa Cruz", "Isabela"],
"preferencias": {
"alimentacion": ["vegetariana", "sin gluten"],
"nivel_actividad": "moderado"
},
"activo": True
}
perfiles = cargar_perfiles()
perfiles.append(nuevo_perfil)
guardar_perfiles(perfiles)
print("✅ Sistema de perfiles actualizado")
usuario["preferencias"]["alimentacion"].
🛡️ Manejo de errores y validación
Un buen programador anticipa fallos. Si un archivo se corrompe, json.load() lanzará un json.JSONDecodeError. Usar try...except evita que tu programa colapse.
Además, siempre valida los datos antes de guardar: verifica que la edad sea un entero positivo y que el email contenga un @.
🔄 JSON vs CSV: ¿Cuándo usar cada uno?
| Característica | CSV | JSON |
|---|---|---|
| Estructura | Plana (filas y columnas) | Jerárquica (anidada) |
| Tipos de datos | Solo texto (hay que convertir) | Nativos (números, booleanos, null) |
| Listas dentro de celdas | ❌ No soporta | ✅ Soporta |
| Uso típico | Datos tabulares simples (Excel) | APIs, configuración, datos complejos |
🌐 JSON en el mundo real: Las APIs y Bases de Datos
Cuando una app consulta tu saldo, el servidor responde con JSON. Las bases de datos modernas como PostgreSQL tienen tipos nativos JSONB para guardar y consultar estos datos directamente, y MongoDB guarda cada documento JSON de forma independiente.
¡Estás aprendiendo el idioma del futuro! JSON es el puente perfecto entre el mundo relacional (tablas) y el mundo NoSQL (documentos).
🚀 Reto Integrador: Elige tu Camino
Ahora que dominas JSON, es momento de aplicar tu conocimiento en un contexto real y creativo. Elige el desafío que más te motive y demuestra tus competencias:
🎨 Reto Visual (Creatividad)
Crea un sistema de guardado de partidas para un juego de texto ambientado en la Amazonía ecuatoriana. Guarda: nombre, nivel, inventario (lista de objetos con cantidad), misiones completadas, ubicación (coordenadas) y decisiones tomadas. Al cargar, muestra un "resumen visual" atractivo.
🔢 Reto Lógico (Análisis)
Convierte el sistema de perfiles en un analizador de datos. Genera un reporte en JSON con estadísticas avanzadas, identifica patrones (¿qué islas visitan juntos los usuarios?), calcula el "perfil promedio" y exporta los datos a CSV para analizarlos en Excel.
🌎 Reto de Expansión (Emprendimiento)
Adapta el sistema a un caso real de tu comunidad: sistema de socios de un club deportivo, catálogo de una biblioteca comunitaria o registro de pacientes en una clínica, manejando historiales y listas anidadas.
🗣️ Reto de Accesibilidad (Empatía)
Haz el sistema robusto: agrega validación completa de todos los datos (emails, fechas), crea copias de seguridad automáticas al modificar, e implementa búsqueda avanzada y exportación/importación de perfiles.
🎮 Evaluación Lúdica: Demuestra tu dominio
Responde estas 5 preguntas para verificar tu comprensión. ¡Recibirás retroalimentación inmediata!
✅ Checkpoint de Aprendizaje
Antes de pasar al Capítulo 5 (navegación del sistema de archivos con pathlib), pregúntate:
- ¿Entiendo qué es JSON y por qué es importante en la web moderna?
- ¿Puedo convertir diccionarios/listas de Python a JSON con
json.dump()? - ¿Entiendo la diferencia entre
dump/load(archivos) ydumps/loads(strings)? - ¿Sé usar
indentyensure_ascii=Falsepara hacer JSON legible? - ¿Puedo trabajar con datos anidados y manejar errores con
try...except?
Si marcaste todos los casilleros, ¡espectacular! Ya puedes manejar datos complejos como un profesional.