2017-04-18 4 views
0

피라미드를 사용하여 json으로 덤프하려는 객체의 계층 구조가 있습니다. 호출 된 __json__ 또는 어댑터 내부에서 사용자 정의 피라미드 json 렌더러를 다시 사용하는 방법은 무엇입니까?

이러한 개체 중 일부

은 그래서 하나가 JSON을 구현하거나 어댑터의 내가 등록한 사용자 정의 json_renderer에 등록이 직렬화 상자 JSON에서없는 (그래서 날짜와 같은 원숭이 패치 것들을 할 필요가 없습니다). 그들이 중첩되어 있기 때문에이 어댑터를 인식하지 이후

의 (a 날짜가 계층 구조 아래로 더있어 예 :) 난 그냥 내 클래스 내에서 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) + "}" 

답변

2

그래서 우선 당신의 __json__ 방법은 다른 데이터 구조 내부 JSON 인코딩 된 문자열을 포함 할 경우 단지 (self) ... 여기에서, 당신은 수동으로 렌더링을 수행 할 수 pyramid.renderers.render을 사용할 수 없습니다 (self, request)을해야합니다. 이렇게하면 항목이 이중으로 인코딩되지만 결국에는 이미 알고있는 것으로 간주됩니다.

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

당신이 데이터를 이중 인코딩 한 후 어댑터가 __json__에서 반환 된 객체와 답의 하위 항목에서 작동하지 않는 이유는 그냥 물어 될 수 싶지 않아 또는 경우에 그 어댑터입니다 의 default 인수를 사용하여 구현되며 사용자가 원하는 것을 지원하지 않습니다. 당신은 json serialization 라이브러리를 찾아야 만 할 것입니다. 그러나 나는 그것을 인식하지 못합니다.

+0

__json__ 메서드도 요청을 전달할 수 있다는 것을 알지 못했습니다. 감사합니다. – juhanic