如何从调用的 __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.dumpsdefault 参数实现的,它只是不支持你想要的。您必须找到一个 json 序列化库...但我不知道有一个。