python使用属性将自定义对象转换为json
在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"}