Lectura de archivos JSON para reconstruir objetos en Python
Clase 17 de 17 • Curso de Python Orientado a Objetos
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.