Qual è il modo migliore per analizzare una risposta JSON dalla libreria delle richieste?


266

Sto usando il requestsmodulo Python per inviare un RESTful GET a un server, per il quale ottengo una risposta in JSON. La risposta JSON è fondamentalmente solo un elenco di elenchi.

Qual è il modo migliore per forzare la risposta a un oggetto Python nativo in modo che io possa iterare o stamparlo usando pprint?

Risposte:


307

Puoi usare json.loads:

import json
import requests

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

Ciò converte una determinata stringa in un dizionario che consente di accedere facilmente ai dati JSON all'interno del codice.

Oppure si può usare @ utile suggerimento di Martijn, e il più alto votato risposta, response.json().


3
ok fantastico, comunque ciascuno degli elementi sarebbe comunque unicode.
felix001,

@ felix001: sì, anche se puoi convertire qualsiasi dato usando str(). D'altra parte i dati unicode non sono male da avere in giro (in preparazione per il futuro).
Simeon Visser,

162
Molto, molto meglio da usare response.json(), in quanto farà un lavoro migliore nel capire la codifica utilizzata. (Dichiarazione di non responsabilità, ho scritto parte di quel codice).
Martijn Pieters

@MartijnPieters: quindi come posso utilizzare il jolly parser di richieste in seguito su un testo memorizzato nella risposta? cioè avere l'output di response.text()?
neurino,

@MartijnPieters, trovato:requests.compat.json.loads(resp_text)
neurino,

469

Dal momento che stai usando requests, dovresti usare il jsonmetodo della risposta .

import requests

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

Si rileva automaticamente che decodificatore uso .


2
Tieni presente che è apparso da qualche parte tra la v0.12 e la v1.0 in modo che, ad esempio, il pacchetto deb Ubuntu 12.04 per le richieste python non abbia ancora questa funzione (è v0.8). Puoi pip install requestsinvece invece di usare il pacchetto deb.
timurb

5
Sono un po 'curioso quello che è ora dataè un elenco di elenco o un dizionario.
Krishna Oza,

6
@Krishna_Oza datarispecchia la struttura del JSON che sta leggendo. Ad esempio, se la risposta è: [{"a": {...}}], dataè una lista, con list[0] == {'a': {...}}. Se la risposta è {"a": "b", "c": "d"}, dataè un dict. Questo risponde alla tua domanda?
pswaminathan,

1
@CGFoX che versione stai usando? Sto ancora vedendo che l'API funziona allo stesso modo sull'ultima versione:>>> import requests >>> r = requests.get('http://httpbin.org/get') >>> r.json <bound method Response.json of <Response [200]>> >>> r.json() {'args': {}, ...}
pswaminathan,

4
Apprezzo questo perché di solito stavo usando il metodo json.loads (response.text) fino a quando su alcuni json di grandi dimensioni ho scoperto che l'uso di respons.json () era molto più veloce dell'altro modo.
Paul R.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.