Qual é a melhor maneira de analisar uma resposta JSON da biblioteca de solicitações?

266

Estou usando o requestsmódulo python para enviar um RESTful GET para um servidor, para o qual recebo uma resposta em JSON. A resposta JSON é basicamente apenas uma lista de listas.

Qual é a melhor maneira de coagir a resposta a um objeto Python nativo para que eu possa iterar ou imprimi-lo usando pprint?

felix001
fonte

Respostas:

307

Você pode usar json.loads:

import json
import requests

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

Isso converte uma determinada string em um dicionário que permite acessar facilmente seus dados JSON dentro do seu código.

Ou você pode usar a sugestão útil de @ Martijn e a resposta mais votada response.json(),.

Simeon Visser
fonte
3
ok ótimo, porém cada um dos elementos ainda seria unicode.
Felix001
@ felix001: sim, embora você possa converter qualquer dado usando str(). Por outro lado, não é ruim ter dados unicode (em preparação para o futuro).
Simeon Visser
162
Muito, muito melhor para usar response.json(), pois ele fará um trabalho melhor para descobrir a codificação usada. (Isenção de responsabilidade, escrevi alguns desses códigos).
Martijn Pieters
@MartijnPieters: então, como posso usar o analisador json de solicitações mais tarde em um texto em cache da resposta? ou seja, tendo a saída de response.text()?
31
@MartijnPieters, encontrado:requests.compat.json.loads(resp_text)
neurino 28/03
469

Desde que você está usando requests, você deve usar o jsonmétodo da resposta .

import requests

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

Ele detecta automaticamente qual decodificador usar .

pswaminathan
fonte
2
Lembre-se de que ele apareceu em algum lugar entre as v0.12 e v1.0, de modo que, por exemplo, o Ubuntu 12.04 deb-package para python-orders ainda não tenha essa função (é a v0.8). Você pode, em pip install requestsvez de usar o pacote deb.
timurb 22/10/2013
5
Estou um pouco curioso, o que é agora dataé uma lista de lista ou dicionário.
Krishna Oza
6
@Krishna_Oza datareflete a estrutura do JSON que está lendo. Por exemplo, se a resposta é: [{"a": {...}}], dataé uma lista, com list[0] == {'a': {...}}. Se a resposta for {"a": "b", "c": "d"}, dataé um ditado. Isso responde à sua pergunta?
Pwaminathan
1
@CGFoX qual versão você está executando? Eu ainda estou vendo o trabalho API da mesma forma sobre a versão mais recente:>>> import requests >>> r = requests.get('http://httpbin.org/get') >>> r.json <bound method Response.json of <Response [200]>> >>> r.json() {'args': {}, ...}
pswaminathan
4
Voto positivo para isso porque eu usava normalmente o método json.loads (response.text) até que em alguns jsons grandes eu descobri que o uso do respons.json () era muito mais rápido do que o contrário.
Paul R.