Aprende a guardar y comunicar objetos de Python usando JSON: dumps/loads, archivos con dump/load y serialización de objetos personalizados con JSONEncoder y object_hook.
Regla mnemotécnica: la s es de string. dumps/loads trabajan con strings; dump/load trabajan con archivos.
Usamos el encoder pasándolo por el parámetro cls: json.dumps(objeto, cls=MascotaEncoder). Para soportar varias clases, basta con agregar más ramas isinstance dentro de default.
La línea return super().default(obj) es clave: si el objeto no hace match con ningún isinstance, delegamos en la clase base, que lanza un TypeError avisando que ese tipo no es serializable. No la omitas.
Dos detalles importantes sobre cómo se aplica object_hook:
dict). Las listas y los valores simples no pasan por el hook.Mientras cls (JSONEncoder) controla la serialización, object_hook controla la deserialización. Son las dos mitades para soportar objetos personalizados con json.