Каков наилучший способ анализа ответа JSON из библиотеки запросов?

266

Я использую requestsмодуль python для отправки RESTful GET на сервер, для которого я получаю ответ в JSON. Ответ JSON - это просто список списков.

Каков наилучший способ заставить ответ на нативный объект Python, чтобы я мог итерировать или распечатывать его, используя pprint?

felix001
источник

Ответы:

307

Вы можете использовать json.loads:

import json
import requests

response = requests.get(...)
json_data = json.loads(response.text)

Это преобразует данную строку в словарь, который позволяет вам легко получить доступ к данным JSON в вашем коде.

Или вы можете использовать полезное предложение @ Martijn и ответ с более высоким рейтингом response.json().

Симеон Виссер
источник
3
хорошо, отлично, однако каждый из элементов все еще будет в юникоде.
felix001
@ felix001: да, хотя вы можете конвертировать любые данные, используя str(). С другой стороны, данные в юникоде неплохо иметь (готовясь к будущему).
Симеон Виссер
162
Гораздо лучше использовать response.json(), так как это поможет лучше понять используемую кодировку. (Отказ от ответственности, я написал часть этого кода).
Мартин Питерс
@MartijnPieters: тогда как я могу использовать запросы парсера json позже в memcached тексте ответа? т.е. с выходом response.text()?
неврино
@MartijnPieters, найдено:requests.compat.json.loads(resp_text)
неврино
469

Поскольку вы используете requests, вы должны использовать метод ответа json.

import requests

response = requests.get(...)
data = response.json()

Он автоматически определяет, какой декодер использовать .

pswaminathan
источник
2
Просто имейте в виду, что он появился где-то между v0.12 и v1.0, так что, например, deb-пакет Ubuntu 12.04 для python-запросов еще не имеет этой функции (это v0.8). pip install requestsХотя вы можете вместо использования пакета deb.
Тимур
5
Мне немного любопытно, что теперь dataэто список или словарь.
Кришна Оза
6
@Krishna_Oza dataотражает структуру JSON, который он читает. Например, если ответ: [{"a": {...}}], dataсписок, с list[0] == {'a': {...}}. Если ответ {"a": "b", "c": "d"}, dataэто диктат. Это отвечает на ваш вопрос?
pswaminathan
1
@CGFoX, какую версию вы используете? Я все еще наблюдаю, как API работает так же в последней версии:>>> import requests >>> r = requests.get('http://httpbin.org/get') >>> r.json <bound method Response.json of <Response [200]>> >>> r.json() {'args': {}, ...}
pswaminathan
4
Воздерживайтесь от этого, потому что я обычно использовал метод json.loads (response.text), пока на некоторых больших jsons я не обнаружил, что использование response.json () было намного быстрее, чем в другом случае.
Пол Р.