Wie kann eine JSON-Antwort aus der Anforderungsbibliothek am besten analysiert werden?

266

Ich verwende das Python- requestsModul , um ein RESTful GET an einen Server zu senden, für den ich in JSON eine Antwort erhalte. Die JSON-Antwort ist im Grunde nur eine Liste von Listen.

Was ist der beste Weg, um die Antwort auf ein natives Python-Objekt zu erzwingen, damit ich sie entweder iterieren oder ausdrucken kann pprint?

felix001
quelle

Antworten:

306

Sie können verwenden json.loads:

import json
import requests

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

Dadurch wird eine bestimmte Zeichenfolge in ein Wörterbuch konvertiert, mit dem Sie problemlos auf Ihre JSON-Daten in Ihrem Code zugreifen können.

Oder Sie können den hilfreichen Vorschlag von @ Martijn und die Antwort mit der höheren Stimme verwenden response.json().

Simeon Visser
quelle
3
ok toll, aber jedes der Elemente wäre immer noch Unicode.
felix001
@ felix001: ja, obwohl du beliebige Daten mit konvertieren kannst str(). Auf der anderen Seite sind Unicode-Daten nicht schlecht (in Vorbereitung auf die Zukunft).
Simeon Visser
162
Viel, viel besser zu verwenden response.json(), da es die verwendete Codierung besser herausfinden kann. (Haftungsausschluss, ich habe einen Teil dieses Codes geschrieben).
Martijn Pieters
@MartijnPieters: Wie kann ich dann Anfragen json Parser später in einem zwischengespeicherten Text der Antwort verwenden? dh mit der Ausgabe von response.text()?
Neurino
@ MartinijnPieters, gefunden:requests.compat.json.loads(resp_text)
Neurino
469

Da benutzt du requests , sollten Sie die jsonMethode der Antwort verwenden.

import requests

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

Es erkennt automatisch, welcher Decoder verwendet werden soll .

Pswaminathan
quelle
2
Denken Sie daran, dass es irgendwo zwischen v0.12 und v1.0 erschienen ist, so dass beispielsweise das Ubuntu 12.04-Deb-Paket für Python-Anfragen diese Funktion noch nicht hat (es ist v0.8). Sie können pip install requestsjedoch anstelle des Deb-Pakets.
Timurb
5
Ich bin ein wenig neugierig, was jetzt dataist, ist es eine Liste von Listen oder ein Wörterbuch.
Krishna Oza
6
@Krishna_Oza dataspiegelt die Struktur des JSON wider , den es liest. Wenn die Antwort beispielsweise lautet : [{"a": {...}}], dataist eine Liste mit list[0] == {'a': {...}}. Wenn die Antwort ist {"a": "b", "c": "d"}, dataist ein Diktat. Beantwortet das deine Frage?
Pswaminathan
1
@CGFoX Welche Version laufen Sie? Ich sehe immer noch, dass die API in der neuesten Version >>> import requests >>> r = requests.get('http://httpbin.org/get') >>> r.json <bound method Response.json of <Response [200]>> >>> r.json() {'args': {}, ...}
genauso funktioniert
4
Stimmen Sie dafür ab, da ich normalerweise die Methode json.loads (response.text) verwendete, bis ich bei einigen großen jsons feststellte, dass die Verwendung von respons.json () viel schneller war als die andere.
Paul R.