Si no le importa instalar un paquete, puede usar json-tricks :
pip install json-tricks
Después de eso, solo necesita importar dump(s)
desde en json_tricks
lugar de json, y generalmente funcionará:
from json_tricks import dumps
json_str = dumps(cls_instance, indent=4)
que dará
{
"__instance_type__": [
"module_name.test_class",
"MyTestCls"
],
"attributes": {
"attr": "val",
"dct_attr": {
"hello": 42
}
}
}
¡Y eso es básicamente todo!
Esto funcionará muy bien en general. Hay algunas excepciones, por ejemplo, si suceden cosas especiales __new__
o si hay más magia de metaclase.
Obviamente, la carga también funciona (de lo contrario, cuál es el punto):
from json_tricks import loads
json_str = loads(json_str)
Esto supone que module_name.test_class.MyTestCls
se puede importar y no ha cambiado de manera no compatible. Volverás a una instancia , no un diccionario o algo así, y debería ser una copia idéntica a la que dejó.
Si desea personalizar cómo se (des) serializa algo, puede agregar métodos especiales a su clase, así:
class CustomEncodeCls:
def __init__(self):
self.relevant = 42
self.irrelevant = 37
def __json_encode__(self):
# should return primitive, serializable types like dict, list, int, string, float...
return {'relevant': self.relevant}
def __json_decode__(self, **attrs):
# should initialize all properties; note that __init__ is not called implicitly
self.relevant = attrs['relevant']
self.irrelevant = 12
que serializa solo parte de los parámetros de los atributos, como un ejemplo.
Y como un bono gratuito, obtienes (des) serialización de matrices numpy, fecha y hora, mapas ordenados, así como la capacidad de incluir comentarios en json.
Descargo de responsabilidad: creé json_tricks , porque tuve el mismo problema que tú.