2017-11-13 6 views
-1

Python (버전 : 3.4.4) Pyramid 프레임 워크를 사용하여 json 요청을 받고 수신 된 json을 Python 객체로 변환합니다. json.loads. 단위에서는 TestApp를 사용하는 경우 아래와 같은 응용 프로그램을 테스트, 모든 아파치 mod_wsgi에를 사용하는 경우 미세하지만, 내가 json.loads에서 다음과 같은 오류 (...)json.loads -> TypeError : JSON 객체가 'dict'이 아닌 str이어야합니다.

TypeError: the JSON object must be str, not 'dict'

왜 어떤 생각을 받는가 작동?

뷰 코드 :

@view_config(route_name='api.analysis', request_method='POST', renderer='json') 
def fetch_my_info(request): 
    data = json.loads(request.json_body, object_hook=lambda d: namedtuple('X', d.keys())(*d.values())) 
    ... 

테스트 코드 :

self.testApp = TestApp(app) 
    response = self.testApp.post_json('/v1/info/analysis', params={"id", "123"}) 
    ... 
+0

저는 피라미드가 이미 json을 당신을위한 사전으로 변환하고 있다고 생각합니까? – SteveJ

+0

이미 dict 인 것처럼 들리네 – SuperStew

+0

TestApp로 단원 테스트가 아닌 mod_wsgi로 테스트하는 이유는 무엇입니까? – edbras

답변

2

request.json_body 당신을위한 파이썬 객체로 몸을 디코딩 이미있다. 직접 해독하고자하는 경우 loads(request.body.decode(request.charset), ...)을 통해 원시 본문을 사용해야합니다.

+0

인코딩은'json.loads (s, econding = None, ...)'의 두 번째 인수이지만 기본값은'utf-8'입니다. 's'가'str' 인스턴스이고 utf-8 (예 : latin-1)이 아닌 ASCII 기반 인코딩으로 인코딩 된 경우 적절한' UCS-2와 같은 ASCII 기반이 아닌 인코딩은 허용되지 않으므로 먼저 유니 코드로 디코딩되어야합니다. " – thebjorn

+0

괜찮 았지만이 컨텍스트에서는 실제로는 명시 적으로 'request.charset'이어야합니다. 요청이 콘텐츠 유형에서 더 이상 지정하지 않으면 utf-8로 기본 설정되며 application/json이 utf-8로 기본 설정되므로 편리합니다. defaults match). 나는 그것을 반영 할 나의 대답을 업데이트 할 것이다. –

관련 문제