使用金字塔,我有一个我想要转储为json的对象层次结构。
其中一些对象不是json serializable的开箱即用,所以我要么实现 json ,要么将适配器注册到我已经注册的自定义json_renderer(所以我不需要修补bug喜欢datetime)。
由于它们是嵌套的(例如,在该层次结构中还有一个日期时间)我不能只在我的类 json 中调用json.dumps,因为它不知道适配器。
我试过阅读源代码,然后通过调试器运行它,感觉我可以从注册表中拉出渲染器,然后用它来捣乱?但我认为这不是预期的方法。当然有更清洁的东西?不幸的是,文档中的所有示例都是微不足道的。
如何在json_dump_using_renderer()中将序列化传递回调用自定义json渲染器?
def custom_json_renderer():
def datetime_adapter(obj, request):
return obj.isoformat()
json_renderer = JSON()
json_renderer.add_adapter(datetime.datetime, datetime_adapter)
class Whatever(object):
def __init__(self, item):
self.item = item
def __json__(self):
return "{ item: " + json_dump_using_renderer(obj.items) + "}"
答案 0 :(得分:3)
首先,对于初学者,__json__
方法应该(self, request)
而不仅仅是(self)
..如果要嵌入,可以使用pyramid.renderers.render
执行手动渲染另一个数据结构中的json编码字符串。请注意,这最终会导致项目被双重编码,但希望您已经意识到这一点。
def __json__(self, request):
return {'item': pyramid.renderers.render('json', obj.items, request=request)}
或者,如果您不希望数据被双重编码,那么您可能只是问为什么适配器不能处理从__json__
返回的对象的子项,答案是适配器是使用default
的{{1}}参数实现的,它只是不支持你想要的。你必须找到一个json序列化库,但是我不知道它。