Який найкращий спосіб проаналізувати відповідь JSON з бібліотеки запитів?


266

Я використовую requestsмодуль python для надсилання RESTful GET на сервер, на який я отримую відповідь у JSON. Відповідь JSON - це лише список списків.

Який найкращий спосіб примусити відповідь до нативного об’єкта Python, щоб я міг або ітератувати, або роздрукувати його за допомогою pprint?

Відповіді:


306

Ви можете використовувати json.loads:

import json
import requests

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

Це перетворює заданий рядок у словник, що дозволяє легко отримувати доступ до даних JSON у межах вашого коду.

Або ви можете використовувати @ корисні пропозиції Мартейн, і тим вище проголосували відповідь, response.json().


3
гаразд чудово, проте кожен з елементів все одно буде однокодовим.
felix001

@ felix001: так, хоча ви можете конвертувати будь-які дані, використовуючи str(). З іншого боку, дані Unicode непогано мати (під час підготовки до майбутнього).
Симеон Віссер

162
Значно, набагато краще використовувати response.json(), оскільки це зробить кращу роботу з з'ясування використовуваного кодування. (Відмова, я написав деякі з цього коду).
Мартійн Пітерс

@MartijnPieters: то як я можу пізніше використовувати запити json parser для запам’ятованого тексту відповіді? тобто маючи вихід response.text()?
neurino

@MartijnPieters, знайдено:requests.compat.json.loads(resp_text)
neurino

469

Оскільки ви використовуєте requests, ви повинні використовувати jsonметод відповіді.

import requests

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

Він автоматично визначає, який декодер використовувати .


2
Тільки майте на увазі, що він з'явився десь між v0.12 та v1.0, так що, наприклад, деб-пакет Ubuntu 12.04 для python-запитів ще не має цієї функції (це v0.8). Ви можете pip install requestsхоч замість цього використовувати деб пакет.
тимбург

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