2016-11-21 2 views
4

저는 Python과 django를 사용하여 일부 REST API를 개발하고 있습니다. 요청 호출에 의해 반환 된 JSON 유니 코드 문자열에 대한 질문이 있습니다. 나는 같은 항목을 반복두고http 응답에 의해 json 객체가 반환되었습니다.

resp = requests.get(self.url) 
if resp.status_code is status.HTTP_200_OK: 
    obj = json.loads(resp.json()) 

수 있습니다 : 그래서, 내가 좋아하는 일을하고 있어요

for o in obj: 
    print o 

이 같은 인쇄 :

{u'pk': 1, u'model': u'aslapp.imagetypemodel', u'fields': {u'type': u'PNG'}} 
{u'pk': 2, u'model': u'aslapp.imagetypemodel', u'fields': {u'type': u'JPG'}} 

그러나, 나는 것을 읽기 resp.json() 호출은이 json.loads() 메서드를 내부적으로 호출해야하며 인코딩 작업을 처리합니다. 단, 다음을 수행하십시오.

obj = resp.json() 
for o in obj: 
    print o 

유니 코드 문자열의 각 문자를 반복합니다. 따라서 JSON 항목을 반복 할 경우 loads 메서드를 통해 다시 실행해야합니까? resp.json()에 의해 반환 된 모든 JSON 레코드를 반복하는 올바른 방법은 무엇입니까?

+0

은 조금 혼란 스러워요? – dahrens

답변

5

당신은 resp.json() 당신을위한 json.loads()를 호출하지, 정확합니다. resp.json() 문자열을 반환하는 경우

따라서 다음 API는 JSON 두 번 인코딩 된 데이터를 가지고 있음을 알 수있다. 예를 들어 {"pk": 1} 대신 "{\"pk\": 1}"을 반환합니다. 당신은 API에 대한 제어가없는 경우

, 당신은 파이썬 객체를 얻기 위해 두 번을 해독해야합니다. `requests.get`은 장고 또는 관련이 [요청] (http://docs.python-requests.org/en/master/) -

+0

오른쪽. 그래서 장고 측에 반환 된 데이터는 데이터 = serializers.serialize ("JSON", 유형) 반환 응답 (데이터)' – Luca

+1

@Luca 장고는 또한'JsonResponse'가 직접 dicts 또는 목록과 같은 물체를 통과 할 수있는이는'이다. – schwobaseggl

+2

Response가 DRF에서 온 것이라면, 그것은 당신을 위해 일련화할 것입니다; DRF 문서 노트에서 이미 렌더링 된 JSON이 아닌 Python 기본 요소 (예 : dicts 및 목록)를 전달해야합니다. 표준 HttpResponse를 사용하거나 Django의 serializer보다는 DRF의 serializer를 사용하십시오. –

관련 문제