Si cela ne vous dérange pas d'installer un paquet pour lui, vous pouvez utiliser json-tricks :
pip install json-tricks
Après cela, il vous suffit d'importer dump(s)
depuis json_tricks
au lieu de json, et cela fonctionnera généralement:
from json_tricks import dumps
json_str = dumps(cls_instance, indent=4)
ce qui donnera
{
"__instance_type__": [
"module_name.test_class",
"MyTestCls"
],
"attributes": {
"attr": "val",
"dct_attr": {
"hello": 42
}
}
}
Et c'est tout!
Cela fonctionnera très bien en général. Il y a quelques exceptions, par exemple si des choses spéciales se produisent __new__
ou s'il y a plus de magie de métaclasse.
Évidemment, le chargement fonctionne également (sinon à quoi ça sert):
from json_tricks import loads
json_str = loads(json_str)
Cela suppose qu'il module_name.test_class.MyTestCls
peut être importé et n'a pas changé de manière non compatible. Vous récupérerez une instance , pas un dictionnaire ou quelque chose, et ce devrait être une copie identique à celle que vous avez sauvegardée.
Si vous souhaitez personnaliser la façon dont quelque chose est (dé) sérialisé, vous pouvez ajouter des méthodes spéciales à votre classe, comme ceci:
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
qui sérialise seulement une partie des paramètres d'attributs, par exemple.
Et en bonus gratuit, vous obtenez la (dé) sérialisation des tableaux numpy, la date et les heures, les cartes commandées, ainsi que la possibilité d'inclure des commentaires dans json.
Avertissement: J'ai créé json_tricks , car j'ai eu le même problème que vous.