Затем вы передаете этот класс в json.dumps() метод как cls kwarg:
json.dumps(cls=MyEncoder)
Если вы также хотите декодировать, вам придется предоставить пользовательский object_hook для JSONDecoder класса. Например:
>>> deffrom_json(json_object): if'fname'in json_object: return FileItem(json_object['fname']) >>> f = JSONDecoder(object_hook = from_json).decode('{"fname": "/foo/bar"}') >>> f <__main__.FileItem object at 0x9337fac> >>>
Ответ 3
Для более сложных классов вы могли бы рассмотреть инструмент jsonpickle:
jsonpickle - это библиотека Python для сериализации и десериализации сложных объектов Python в JSON и из него.
Стандартные библиотеки Python для кодирования Python в JSON, такие как json stdlib, simplejson и demjson, могут обрабатывать только примитивы Python, которые имеют прямой эквивалент JSON (например, dicts, списки, строки, целые числа и т.д.). jsonpickle строится поверх этих библиотек и позволяет сериализовывать более сложные структуры данных в JSON. jsonpickle легко настраивается и расширяется – позволяет пользователю выбирать серверную часть JSON и добавлять дополнительные серверные части.
Большинство ответов связаны с изменением вызова на json.dumps(), что не всегда возможно или желательно (например, это может произойти внутри компонента фреймворка).
Если вы хотите иметь возможность вызывать json.dumps(obj) как есть, то простым решением является наследование от dict:
f = FileItem('tasks.txt') json.dumps(f) #No need to change anything here
Это работает, если ваш класс представляет собой просто базовое представление данных, для более сложных задач вы всегда можете явно задать ключи в вызове dict.__init__().
Это работает, потому что json.dumps() проверяет, является ли объект одним из нескольких известных типов с помощью довольно непитонического isinstance(value, dict) - так что можно было бы подделать это с помощью __class__ и некоторых других методов, если вы действительно не хотите наследовать от dict.