Resumen

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.