Se você não se importa em instalar um pacote, pode usar o json-tricks :
pip install json-tricks
Depois disso, você só precisa importar dump(s)
de em json_tricks
vez de json, e geralmente funcionará:
from json_tricks import dumps
json_str = dumps(cls_instance, indent=4)
o que vai dar
{
"__instance_type__": [
"module_name.test_class",
"MyTestCls"
],
"attributes": {
"attr": "val",
"dct_attr": {
"hello": 42
}
}
}
E é basicamente isso!
Isso funcionará muito bem em geral. Existem algumas exceções, por exemplo, se coisas especiais acontecem __new__
ou mais magia de metaclasse está acontecendo.
Obviamente, o carregamento também funciona (caso contrário, qual é o objetivo):
from json_tricks import loads
json_str = loads(json_str)
Isso pressupõe que module_name.test_class.MyTestCls
possa ser importado e não tenha sido alterado de maneiras incompatíveis. Você retornará uma instância , não algum dicionário ou algo assim, e deve ser uma cópia idêntica à que você despejou.
Se você deseja personalizar como algo é (des) serializado, você pode adicionar métodos especiais à sua classe, como:
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 apenas parte dos parâmetros dos atributos, como exemplo.
E como um bônus gratuito, você obtém (des) serialização de matrizes numpy, data e hora, mapas ordenados, bem como a capacidade de incluir comentários no json.
Isenção de responsabilidade: criei json_tricks , porque tive o mesmo problema que você.