Lectura de archivos JSON para reconstruir objetos en Python
Clase 17 de 17 • Curso de Python Orientado a Objetos
Contenido del curso
Encapsulación y Comportamiento de Objetos
Implementar Protocolos con Métodos Especiales
Relaciones entre Clases y Polimorfismo
- 12

Búsqueda de libros y ejecución de préstamos en Python
08:57 min - 13

Clases abstractas en Python con ABC y @abstractmethod
04:32 min - 14

Decoradores property en Python para atributos con validación
06:22 min - 15

Decoradores @staticmethod y @classmethod en Python
07:18 min - 16

Serialización de objetos Python a JSON para persistencia de datos
07:47 min
Diseño Avanzado y Patrones de Software
Leer un archivo JSON y reconstruir el estado completo de una app en Python es clave para la persistencia. Aquí verás cómo implementar un método para cargar datos, instanciar objetos de Biblioteca, LibroFísico, Estudiante y Profesor, y validar campos como ISBN y disponibilidad usando with open, json.load, encoding y append.
¿Cómo cargar y reconstruir el estado de la aplicación desde JSON en Python?
La idea central es leer el archivo y recrear las instancias de tu dominio. En persistencia.py se crea un método para cargar datos que solo recibe self. Se abre el archivo con modo de solo lectura y el mismo encoding con el que se guardó. Luego, se usa json.load para obtener un diccionario con toda la información.
- Abrir archivo con with open en modo "r" y mismo encoding.
- Convertir el contenido a diccionario con json.load.
- Usar las llaves del diccionario para reconstruir Biblioteca, libros y usuarios.
- Retornar la instancia de Biblioteca para usarla en main.py.
¿Qué hace el método cargar_datos?
- Define un nuevo método: no recibe parámetros extra.
- Lee el archivo: usa "r" de read y el encoding correcto.
- Carga el JSON a una variable datos: ahora es un diccionario con nombre, usuarios y libros.
- Al final retorna la biblioteca creada.
¿Cómo leer el archivo con with open y json.load?
Usa el patrón de contexto y respeta el encoding al leer y escribir para evitar errores con caracteres especiales.
import json class Persistencia: def cargar_datos(self): with open(self.archivo, "r", encoding="utf-8") as f: datos = json.load(f) # a partir de aquí se reconstruyen las instancias # y se retorna la biblioteca
¿Cómo recrear libros y usuarios con clases y listas?
Primero se crea una instancia de Biblioteca. Luego se recorre la lista de libros del diccionario y se instancia LibroFísico con las llaves correctas: título, autor, ISBN y disponible. Finalmente, se agrega cada libro a la lista interna con append.
¿Cómo reconstruir libros con su disponibilidad?
Incluir disponibilidad es importante: al guardar, puede que un libro esté marcado como no disponible, y hay que preservarlo.
from biblioteca import Biblioteca from libros import LibroFisico biblioteca = Biblioteca(nombre=datos["nombre"]) # ejemplo de uso de la llave "nombre" for dato_libro in datos["libros"]: libro = LibroFisico( titulo=dato_libro["titulo"], autor=dato_libro["autor"], isbn=dato_libro["isbn"], disponible=dato_libro["disponible"], ) biblioteca.libros.append(libro)
¿Cómo diferenciar estudiantes y profesores al reconstruir usuarios?
En usuarios hay dos tipos: Estudiante y Profesor. La diferencia práctica en los datos es la presencia de la llave "carrera". Si existe, es Estudiante; si no, es Profesor.
from usuarios import Estudiante, Profesor for dato_usuario in datos["usuarios"]: if "carrera" in dato_usuario: usuario = Estudiante( nombre=dato_usuario["nombre"], cedula=dato_usuario["cedula"], carrera=dato_usuario["carrera"], ) else: usuario = Profesor( nombre=dato_usuario["nombre"], cedula=dato_usuario["cedula"], ) biblioteca.usuarios.append(usuario)
- Diferenciar por llave "carrera" simplifica el flujo.
- Una buena práctica adicional sería guardar el tipo explícito en el JSON.
¿Cómo integrar la carga en main.py?
La biblioteca se define desde la función de carga y la guardada se mueve al final de la ejecución para persistir cualquier cambio.
- Importar persistencia.
- Asignar biblioteca desde cargar_datos.
- Ejecutar la app.
- Guardar después de los cambios.
¿Qué buenas prácticas y retos quedan pendientes?
El proyecto funciona, pero puede mejorar con manejo de errores y ajustes de persistencia.
- Manejo de errores: ¿qué pasa si el archivo no existe al cargar?.
- Consistencia: usar siempre el mismo encoding en lectura y escritura.
- Limpieza: remover prints de depuración al finalizar.
- Extensión de datos: incluir el tipo de usuario en el diccionario.
- Verificación rápida: editar biblioteca.json y ver cambios reflejados al ejecutar python main.py.
Si ya lo implementaste, comparte en comentarios cómo resolviste el manejo de errores y qué mejoras sumarías a la persistencia.