🎯 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.

La analogía de las cajas: Un archivo CSV es como una caja plana de zapatos: solo puedes apilar cosas en una sola capa. JSON es como un mueble modular con cajones dentro de cajones: puede contener estructuras dentro de estructuras, manteniendo todo ordenado, conectado y con sentido. ¡JSON es el héroe que resuelve este problema!

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 / falseTrue / False
nullNone
Diferencia clave: En JSON, las claves siempre van entre comillas dobles ", 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")
Acceso a datos anidados: Imagina que JSON es una serie de cajas dentro de cajas. Para llegar a la alimentación de María, abres la caja "preferencias" y luego la caja "alimentacion": 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
EstructuraPlana (filas y columnas)Jerárquica (anidada)
Tipos de datosSolo texto (hay que convertir)Nativos (números, booleanos, null)
Listas dentro de celdas❌ No soporta✅ Soporta
Uso típicoDatos tabulares simples (Excel)APIs, configuración, datos complejos
Regla práctica: Si tus datos son tablas simples → CSV. Si tus datos tienen estructura compleja o anidada → JSON.

🌐 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!

Puntuación: 0/5

Pregunta 1 de 5

✅ 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) y dumps/loads (strings)?
  • ¿Sé usar indent y ensure_ascii=False para 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.