¿Cuál es la mejor manera de analizar una respuesta JSON desde la biblioteca de solicitudes?


266

Estoy usando el requestsmódulo de Python para enviar un RESTful GET a un servidor, para lo cual obtengo una respuesta en JSON. La respuesta JSON es básicamente solo una lista de listas.

¿Cuál es la mejor manera de forzar la respuesta a un objeto nativo de Python para que pueda iterarlo o imprimirlo usando pprint?

Respuestas:


307

Puedes usar json.loads:

import json
import requests

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

Esto convierte una cadena dada en un diccionario que le permite acceder fácilmente a sus datos JSON dentro de su código.

O puede utilizar @ útil sugerencia de Martijn, y cuanto mayor sea votado respuesta, response.json().


3
ok genial, sin embargo, cada uno de los elementos seguiría siendo unicode.
felix001 01 de

@ felix001: sí, aunque puede convertir cualquier información usando str(). Por otro lado, no es malo tener datos Unicode (en preparación para el futuro).
Simeon Visser

162
Mucho, mucho mejor de usar response.json(), ya que hará un mejor trabajo al descubrir la codificación utilizada. (Descargo de responsabilidad, escribí algo de ese código).
Martijn Pieters

@MartijnPieters: entonces, ¿cómo puedo usar las solicitudes json parser más adelante en un texto de la respuesta en memoria caché? es decir, tener la salida de response.text()?
neurino

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

469

Como estás usando requests, debes usar el jsonmétodo de respuesta .

import requests

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

Se detecta automáticamente que decodificador para uso .


2
Solo tenga en cuenta que ha aparecido en algún lugar entre v0.12 y v1.0, por lo que, por ejemplo, Ubuntu 12.04 deb-package para python-request aún no tiene esta función (es v0.8). Sin pip install requestsembargo, puede en lugar de usar el paquete deb.
timurb

55
Tengo un poco de curiosidad por saber qué es ahora datauna lista de listas o un diccionario.
Krishna Oza

66
@ Krishna_Oza datarefleja la estructura del JSON que está leyendo. Por ejemplo, si la respuesta es: [{"a": {...}}], dataes una lista, con list[0] == {'a': {...}}. Si la respuesta es {"a": "b", "c": "d"}, dataes un dict. Eso responde tu pregunta?
pswaminathan

1
@CGFoX, ¿qué versión estás ejecutando? Todavía veo que la API funciona de la misma manera en la última versión:>>> import requests >>> r = requests.get('http://httpbin.org/get') >>> r.json <bound method Response.json of <Response [200]>> >>> r.json() {'args': {}, ...}
pswaminathan

44
Voté a favor de esto porque usualmente estaba usando el método json.loads (response.text) hasta que en algunos json grandes descubrí que usar respons.json () era mucho más rápido que a la inversa.
Paul R.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.