jaraco дал довольно аккуратный ответ. Мне нужно было исправить некоторые незначительные вещи, но это работает:
# Your custom class
class MyCustom(object):
def __json__(self):
return {
'a': self.a,
'b': self.b,
'__python__': 'mymodule.submodule:MyCustom.from_json',
}
to_json = __json__ # supported by simplejson
@classmethod
def from_json(cls, json):
obj = cls()
obj.a = json['a']
obj.b = json['b']
return obj
# Dumping and loading
import simplejson
obj = MyCustom()
obj.a = 3
obj.b = 4
json = simplejson.dumps(obj, for_json=True)
# Two-step loading
obj2_dict = simplejson.loads(json)
obj2 = MyCustom.from_json(obj2_dict)
# Make sure we have the correct thing
assert isinstance(obj2, MyCustom)
assert obj2.__dict__ == obj.__dict__
Обратите внимание, что нам нужно выполнить два шага для загрузки. На данный момент свойство __python__
не используется.
Используя метод AlJohri , я проверяю популярность подходов:
Сериализация (Python -> JSON):
to_json
: 266,595 на 2018-06-27 toJSON
: 96,307 по 2018-06-27 __json__
: 8 504 по 2018-06-27 for_json
: 6,937 на 2018-06-27 Дезициализация (JSON -> Python):
from_json
: 226,101 по 2018-06-27