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


266

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

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

Ответы:


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()

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


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 () было намного быстрее, чем в другом случае.
Пол Р.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.