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.