Не знаю ничего заранее созданного, но вы можете написать его, если ваши объекты достаточно просты. Переопределите метод по умолчанию в JSONEncoder для просмотра inspect.getmembers (obj) (inspect - более читаемый способ получения наборов атрибутов в __dict__
).
#!/usr/bin/env python3
import inspect
from json import JSONEncoder
class TreeNode:
def __init__(self, value, left=None, right=None):
self.value = value
self.left = left
self.right = right
class ObjectJSONEncoder(JSONEncoder):
def default(self, reject):
is_not_method = lambda o: not inspect.isroutine(o)
non_methods = inspect.getmembers(reject, is_not_method)
return {attr: value for attr, value in non_methods
if not attr.startswith('__')}
if __name__ == '__main__':
tree = TreeNode(42,
TreeNode(24),
TreeNode(242),
)
print(ObjectJSONEncoder().encode(tree))
Обновление: @Alexandre Deschamps говорит, что isroutine работает лучше, чем метод для некоторого ввода.