Quelle est la meilleure façon d'analyser une réponse JSON à partir de la bibliothèque de requêtes?

266

J'utilise le requestsmodule python pour envoyer un RESTful GET à un serveur, pour lequel j'obtiens une réponse en JSON. La réponse JSON est simplement une liste de listes.

Quelle est la meilleure façon de contraindre la réponse à un objet Python natif afin que je puisse soit l'itérer soit l'imprimer à l'aide pprint?

felix001
la source

Réponses:

307

Vous pouvez utiliser json.loads:

import json
import requests

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

Cela convertit une chaîne donnée en un dictionnaire qui vous permet d'accéder facilement à vos données JSON dans votre code.

Ou vous pouvez utiliser @ suggestion utile de Martijn, et plus voté réponse response.json().

Simeon Visser
la source
3
ok super, mais chacun des éléments serait toujours unicode.
felix001
@ felix001: oui, bien que vous puissiez convertir toutes les données en utilisant str(). D'un autre côté, les données unicode ne sont pas mauvaises à avoir autour (en préparation pour l'avenir).
Simeon Visser
162
Beaucoup, beaucoup mieux à utiliser response.json(), car cela permettra de mieux comprendre l'encodage utilisé. (Avertissement, j'ai écrit une partie de ce code).
Martijn Pieters
@MartijnPieters: alors comment puis-je utiliser les requêtes json parser plus tard sur un texte memcached de la réponse? c'est-à-dire ayant la sortie de response.text()?
neurino
@MartijnPieters, trouvé:requests.compat.json.loads(resp_text)
neurino
469

Puisque vous utilisez requests, vous devez utiliser la jsonméthode de la réponse .

import requests

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

Il détecte automatiquement le décodeur à utiliser .

pswaminathan
la source
2
Gardez juste à l'esprit qu'il est apparu quelque part entre la v0.12 et la v1.0, de sorte que, par exemple, Deb-package Ubuntu 12.04 pour les requêtes python n'a pas encore cette fonction (c'est la v0.8). Vous pouvez pip install requestscependant au lieu d'utiliser le paquet deb.
timurb
5
Je suis un peu curieux ce qui est maintenant datac'est une liste de liste ou un dictionnaire.
Krishna Oza
6
@Krishna_Oza datareflète la structure du JSON qu'il lit. Par exemple, si la réponse est: [{"a": {...}}], dataune liste, avec list[0] == {'a': {...}}. Si la réponse est {"a": "b", "c": "d"}, datac'est un dicton. Est-ce que ça répond à votre question?
pswaminathan
1
@CGFoX quelle version utilisez-vous? Je vois toujours l'API fonctionner de la même manière sur la dernière version:>>> import requests >>> r = requests.get('http://httpbin.org/get') >>> r.json <bound method Response.json of <Response [200]>> >>> r.json() {'args': {}, ...}
pswaminathan
4
Votez pour cela parce que j'utilisais généralement la méthode json.loads (response.text) jusqu'à ce que sur certains gros jsons, je trouve que l'utilisation de respons.json () était beaucoup plus rapide que dans l'autre sens.
Paul R.