2017-04-18 1 views
0

En utilisant la pyramide, j'ai une hiérarchie d'objets que je veux sauvegarder comme json.Comment réutiliser un rendu json de la pyramide personnalisée à partir d'un __json__ ou d'un adaptateur appelé?

Certains de ces objets ne sont pas hors de la boîte JSON sérialisable donc je soit mettre en œuvre JSON ou se sont inscrits à un json_renderer personnalisé de l'adaptateur que je me suis inscrit (donc je ne dois pas arranger les choses de singe comme datetime). Comme ils sont imbriqués (par exemple, il y a un datetime plus bas dans cette hiérarchie), je ne peux pas appeler json.dumps dans mes classes json car il ne connaît pas les adaptateurs.

J'ai essayé de lire la source, et d'exécuter ceci par le débogueur et l'impression que je pourrais aller tirer le moteur de rendu du registre et tripoter avec cela? Mais je ne pense pas que ce soit la méthode prévue. Sûrement il y a quelque chose de plus propre? Malheureusement, tous les exemples dans les docs sont triviaux.

Comment est-ce que je peux passer la sérialisation au rendu json personnalisé d'appel à json_dump_using_renderer()?

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) + "}" 

Répondre

2

Donc, pour commencer votre méthode __json__ devrait prendre (self, request) pas seulement (self) .. À partir de là, vous pouvez utiliser pyramid.renderers.render pour effectuer un rendu manuel si vous souhaitez intégrer une chaîne codée JSON dans une autre structure de données. Notez que cela finira par entraîner le double encodage de l'élément, mais j'espère que vous le savez déjà.

def __json__(self, request): 
    return {'item': pyramid.renderers.render('json', obj.items, request=request)} 

Alternativement, si vous ne voulez pas que les données soient double alors vous pourriez encoder simplement se demander pourquoi les adaptateurs ne fonctionnent pas sur les sous-éléments d'un objet retourné de __json__ et la réponse est que les adaptateurs sont mis en œuvre en utilisant l'argument default de json.dumps et il ne supporte pas ce que vous voulez. Vous devriez trouver une librairie de sérialisation json qui le fait ... mais je n'en connais pas une.

+0

Je n'étais pas au courant que la méthode __json__ pourrait également être passé la demande, merci. – juhanic