Jaki jest najlepszy sposób na przeanalizowanie odpowiedzi JSON z biblioteki żądań?

266

Korzystam z requestsmodułu python , aby wysłać RESTful GET na serwer, na który otrzymuję odpowiedź w JSON. Odpowiedź JSON to w zasadzie tylko lista list.

Jaki jest najlepszy sposób na wymuszenie odpowiedzi na rodzimy obiekt Pythona, aby można go było iterować lub wydrukować za pomocą pprint?

felix001
źródło

Odpowiedzi:

306

Możesz użyć json.loads:

import json
import requests

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

Konwertuje dany ciąg na słownik, który umożliwia łatwy dostęp do danych JSON w kodzie.

Można też użyć @ pomocnych sugestii Martijn, a im wyższy głosowało odpowiedź response.json().

Simeon Visser
źródło
3
ok świetnie, jednak każdy z elementów nadal byłby Unicode.
felix001
@ felix001: tak, chociaż możesz konwertować dowolne dane za pomocą str(). Z drugiej strony dane unicode nie są złe (w przygotowaniu na przyszłość).
Simeon Visser
162
O wiele, dużo lepiej w użyciu response.json(), ponieważ lepiej sobie z tym poradzi . (Oświadczenie, napisałem część tego kodu).
Martijn Pieters
@MartijnPieters: w jaki sposób mogę później użyć parsera json żądań na zapisanym w pamięci tekście odpowiedzi? tj. posiadające wyjście response.text()?
neurino
@MartijnPieters, znaleziono:requests.compat.json.loads(resp_text)
neurino
469

Ponieważ używasz requests, powinieneś użyć metody odpowiedzi json.

import requests

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

To automatycznie wykrywa która dekoder do użytku .

pswaminathan
źródło
2
Pamiętaj tylko, że pojawił się gdzieś pomiędzy wersją v0.12 a v1.0, aby na przykład pakiet debugujący Ubuntu 12.04 dla żądań python nie miał jeszcze tej funkcji (jest to v0.8). Możesz pip install requestsjednak zamiast używać pakietu deb.
timurb
5
Jestem trochę ciekawy, co jest teraz datalistą lub słownikiem.
Krishna Oza
6
@Krishna_Oza dataodzwierciedla strukturę czytanego JSON. Na przykład, jeśli odpowiedź brzmi: [{"a": {...}}], dataznajduje się lista, z list[0] == {'a': {...}}. Jeśli odpowiedź brzmi {"a": "b", "c": "d"}, datato dykt. Czy to jest odpowiedź na Twoje pytanie?
pswaminathan
1
@CGFoX jakiej wersji używasz? Nadal widzę, że interfejs API działa w ten sam sposób w najnowszej wersji:>>> import requests >>> r = requests.get('http://httpbin.org/get') >>> r.json <bound method Response.json of <Response [200]>> >>> r.json() {'args': {}, ...}
pswaminathan
4
Poproś o to, ponieważ zwykle używałem metody json.loads (response.text), dopóki w niektórych dużych jsonach nie stwierdziłem, że użycie respons.json () było znacznie szybsze niż w drugą stronę.
Paul R.