Если вы не против установки пакета для него, вы можете использовать json-tricks :
pip install json-tricks
После этого вам просто нужно импортировать dump(s)
из json_tricks
вместо json, и он обычно работает:
from json_tricks import dumps
json_str = dumps(cls_instance, indent=4)
, который даст
{
"__instance_type__": [
"module_name.test_class",
"MyTestCls"
],
"attributes": {
"attr": "val",
"dct_attr": {
"hello": 42
}
}
}
И это в основном это!
Это будет отлично работать в целом. Существуют некоторые исключения, например. если в __new__
происходят особые вещи, или происходит больше метаклассической магии.
Очевидно, что загрузка также работает (в противном случае в чем смысл):
from json_tricks import loads
json_str = loads(json_str)
Это предполагает, что module_name.test_class.MyTestCls
могут быть импортированы и не изменены несовместимыми способами. Вы вернете экземпляр, а не какой-либо словарь или что-то еще, и он должен быть идентичной копией того, который вы сбросили.
Если вы хотите настроить, как что-то получает (де) сериализован, вы можете добавить специальные методы для вашего класса, например:
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
, который в качестве примера сериализует только часть параметров атрибутов.
И как бесплатный бонус, вы получаете (de) сериализация массивов numpy, date & amp; временами, упорядоченные карты, а также возможность включать комментарии в json.
Отказ: я создал json_tricks , потому что у меня была та же проблема, что и вы.