python使用属性将自定义对象转换为json

1 投票
1 回答
935 浏览
提问于 2025-04-18 07:25

在Bottle框架或者说Python中,有没有办法利用自定义对象的属性把它转换成JSON格式?我看到一些帖子建议在自定义类里写一个叫to_json(self)的方法。我在想有没有什么自动化的方法可以做到这一点?

我之前是做Java的,希望能有类似Jackson的模块,配合XmlRootElement这样的注解(在Python中可以理解为装饰器)。但到目前为止我还没找到这样的东西。

更新 我不想使用__dict__里的元素,而是想用我自定义类的属性来构建JSON。

1 个回答

4

你可以用一个装饰器来“标记”那些需要被表示的属性。虽然你还是需要写一个 to_json 的函数,但只需要在基类中定义一次就可以了。

下面是一个简单的例子:

import json
import inspect

def viewable(fnc):
        '''
            Decorator, mark a function as viewable and gather some metadata in the process

        '''
        def call(*pargs, **kwargs):
                return fnc(*pargs, **kwargs)
        # Mark the function as viewable
        call.is_viewable = True
        return call

class BaseJsonable(object):

    def to_json(self):
        result = {}
        for name, member in inspect.getmembers(self):
            if getattr(member, 'is_viewable', False):
                value = member()
                result[name] = getattr(value, 'to_json', value.__str__)()
        return json.dumps(result)

class Person(BaseJsonable):

    @viewable
    def name(self):
        return self._name


    @viewable
    def surname(self):
        return self._surname

    def __init__(self, name, surname):
        self._name = name
        self._surname = surname


p = Person('hello', 'world')
print p.to_json()

输出结果是

{"surname": "world", "name": "hello"}

撰写回答