如何从调用的 __json__ 或适配器中重用自定义金字塔 json 渲染器?
How to reuse a custom pyramid json renderer from inside a called __json__ or adapter?
使用金字塔,我有一个对象层次结构,我想转储为 json。
其中一些对象不是开箱即用的 json 可序列化,所以我要么实现 json 要么将适配器注册到自定义 json_renderer 我已经注册了(所以我不需要猴子修补日期时间之类的东西)。
因为它们是嵌套的(例如,在该层次结构的下方有一个日期时间)我不能只在我的 类 json[= 中调用 json.dumps 25=] 因为它不知道适配器。
我已经尝试通读源代码,运行 通过调试器,我觉得我可以去从注册表中提取渲染器,然后 fiddle 这样做?但我认为这不是预期的方法。当然有更清洁的东西吗?不幸的是,文档中的所有示例都是微不足道的。
如何将序列化传回 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) + "}"
所以对于初学者来说,您的 __json__
方法应该采用 (self, request)
而不仅仅是 (self)
.. 从那里,如果需要,您可以使用 pyramid.renderers.render
执行手动渲染将 json 编码的字符串嵌入到另一个数据结构中。请注意,这最终会导致项目被双重编码,但希望您已经意识到这一点。
def __json__(self, request):
return {'item': pyramid.renderers.render('json', obj.items, request=request)}
或者,如果您不希望数据被双重编码,那么您可能只是想问为什么适配器不能处理从 __json__
返回的对象的子项,答案是适配器是使用 json.dumps
的 default
参数实现的,它只是不支持你想要的。您必须找到一个 json 序列化库...但我不知道有一个。
使用金字塔,我有一个对象层次结构,我想转储为 json。
其中一些对象不是开箱即用的 json 可序列化,所以我要么实现 json 要么将适配器注册到自定义 json_renderer 我已经注册了(所以我不需要猴子修补日期时间之类的东西)。
因为它们是嵌套的(例如,在该层次结构的下方有一个日期时间)我不能只在我的 类 json[= 中调用 json.dumps 25=] 因为它不知道适配器。
我已经尝试通读源代码,运行 通过调试器,我觉得我可以去从注册表中提取渲染器,然后 fiddle 这样做?但我认为这不是预期的方法。当然有更清洁的东西吗?不幸的是,文档中的所有示例都是微不足道的。
如何将序列化传回 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) + "}"
所以对于初学者来说,您的 __json__
方法应该采用 (self, request)
而不仅仅是 (self)
.. 从那里,如果需要,您可以使用 pyramid.renderers.render
执行手动渲染将 json 编码的字符串嵌入到另一个数据结构中。请注意,这最终会导致项目被双重编码,但希望您已经意识到这一点。
def __json__(self, request):
return {'item': pyramid.renderers.render('json', obj.items, request=request)}
或者,如果您不希望数据被双重编码,那么您可能只是想问为什么适配器不能处理从 __json__
返回的对象的子项,答案是适配器是使用 json.dumps
的 default
参数实现的,它只是不支持你想要的。您必须找到一个 json 序列化库...但我不知道有一个。