2016-11-21 4 views
4

Я использую python и django для разработки некоторых API REST. У меня вопрос о строке unicode JSON, возвращаемой вызовом запросов. Таким образом, я делаю что-то вроде:json object возвращается HTTP-ответом

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 

Только итерации по каждому символу в строке юникода. Так я должен снова запустить его через метод loads, если я хочу перебирать записи JSON? Каким будет правильный способ повторить все записи JSON, возвращенные возвратом resp.json().

+0

Я немного смущен - 'request.get' связан с django или [запросами] (http://docs.python-requests.org/en/master/)? – dahrens

ответ

5

Вы правы, resp.json() действительно звонит json.loads() для вас.

Следовательно, если resp.json() возвращает строку, то это говорит о том, что API json закодировал данные дважды. Например, он возвращает "{\"pk\": 1}" вместо {"pk": 1}.

Если у вас нет никакого контроля над API, вам придется дважды декодировать его, чтобы получить объект Python.

+0

Справа. Таким образом, на стороне django возвращаемые данные: 'data = serializers.serialize (« json », types) return Response (data)' – Luca

+1

@Luca Django также имеет 'JsonResponse', который вы можете передавать непосредственно как объекты или списки напрямую. – schwobaseggl

+2

Если ответ от DRF, то он будет сериализовать вещи для вас; как отмечает DRF, вы должны передать примитивы Python (например, dicts и lists), а не уже обработанный JSON. Используйте стандартный HttpResponse или используйте сериализаторы DRF, а не Django. –

Смежные вопросы