Ler e Analisar um Arquivo JSON de uma URL em Python
Ler JSON de uma URL em Python transforma uma resposta remota em dados prontos para uso imediato. Obtenha a resposta com urllib.request e passe o corpo para json.loads para obter um dicionário ou lista. Esse padrão é ideal para APIs públicas, arquivos de configuração hospedados e conjuntos de dados que mudam independentemente do código.
Exemplo Python: Ler JSON de uma URL
Saída:
A saída aparecerá aqui...
Saída:
Squad: Super Hero Squad
Members: 3
Como Este Exemplo Funciona
urllib.request.urlopen(url)envia um GET síncrono e retorna uma resposta HTTP; o blocowithfecha a conexão em seguida.response.read()retorna o corpo como bytes brutos.json.loadsaceita bytes diretamente, portanto nenhum passo manual de.decode("utf-8")é necessário.- O parsing converte o objeto JSON em um dict Python, indexado com
data["squadName"]e medido comlen(data["members"]).
Neste runtime, urlopen é síncrono, portanto não requer await nem asyncio, embora muitos tutoriais envolvam chamadas de rede em código assíncrono.
json.load vs json.loads
Ambas as funções desserializam JSON em objetos Python; a diferença está no que elas leem.
| Função | Entrada | Use quando |
|---|---|---|
json.loads(...) | um valor str ou bytes | o conteúdo já está em memória, como response.read() |
json.load(...) | um objeto arquivo ou fluxo | há um handle aberto, como open(path) ou a própria resposta |
Aqui json.loads(response.read()) e json.load(response) produzem o mesmo dict. O erro comum é passar o tipo errado: dar uma string para json.load ou um objeto arquivo para json.loads lança AttributeError ou TypeError.
Inspecionar a Requisição JSON no Run Details
Abra Run Details após o programa terminar. Ele separa a requisição de rede do script dos pacotes que o runtime carregou para executá-lo.
| Sinal do Run Details | Significado |
|---|---|
| Requests mostra um GET para raw.githubusercontent.com com status 200 | O arquivo JSON foi obtido pela rede com sucesso |
| A duração da requisição em ms | Quanto tempo levou a busca, separado do parsing |
| A requisição retornou 403/404, foi bloqueada ou falhou | A URL era inacessível ou sem CORS, então nunca chegou ao código |
| Packages está vazio (“No runtime packages”) | json e urllib são biblioteca padrão, nada foi instalado |
A seção Packages vazia confirma que essa abordagem não requer instalação. Exemplos que importam beautifulsoup4 ou pandas listam um pacote carregado aqui, como o exemplo de web scraping; ler JSON com a biblioteca padrão não lista nenhum.
Ler de uma URL no navegador funciona apenas quando o endpoint envia cabeçalhos CORS. O arquivo acima é um arquivo com CORS habilitado no GitHub raw; uma URL cross-origin sem esses cabeçalhos é bloqueada antes de o código ser executado, o que aparece como uma requisição com falha em vez de JSONDecodeError.
Erros Comuns ao Ler JSON de uma URL
Erro: ler o fluxo de resposta duas vezes.
Incorreto:
raw = response.read()
data = json.loads(response.read())
Correto:
data = json.loads(response.read())
Por que acontece: urlopen retorna um fluxo que é consumido uma vez; um segundo read() retorna bytes vazios.
Erro: chamar .get() em um array JSON analisado.
Incorreto:
data = json.loads(response.read())
first = data.get("name")
Correto:
data = json.loads(response.read())
first = data[0] if isinstance(data, list) else data["name"]
Por que acontece: um array JSON de nível superior é analisado como uma lista Python, que não tem .get; é necessário indexá-la.
Tratamento de Erros e Chaves Ausentes
urlopen lança HTTPError para respostas 4xx e 5xx, mas o objeto de erro ainda é legível, então um corpo de erro JSON pode ser analisado capturando-o com try/except:
from urllib.error import HTTPError
try:
with urllib.request.urlopen(url) as response:
data = json.loads(response.read())
except HTTPError as err:
data = json.loads(err.read())
Para um campo opcional, use data.get("key") para retornar None em vez de lançar KeyError. O módulo json da biblioteca padrão analisa entradas não confiáveis com segurança, portanto nunca use eval() para ler JSON.
FAQ
Como ler um arquivo JSON em Python?
Para um arquivo remoto, abra-o com urllib.request.urlopen(url) e passe os bytes para json.loads. Para um arquivo em disco, use with open(path) as f: data = json.load(f). Ambos retornam um dict ou lista Python.
Qual é a diferença entre json.load e json.loads?
json.load lê de um objeto arquivo ou fluxo, enquanto json.loads lê de um valor str ou bytes. O “s” final significa string. Use loads quando o conteúdo já estiver em memória.
É necessária a biblioteca requests para ler JSON em Python?
Não. urllib.request e json são ambos biblioteca padrão, portanto você pode buscar e analisar JSON sem instalação alguma. A biblioteca requests adiciona conveniências como um helper .json() e gerenciamento de sessões, mas é uma dependência de terceiros.
O que é JSON em Python?
JSON é um formato de texto para dados estruturados. Python mapeia um objeto JSON para um dict, um array para uma lista e os primitivos para str, int, float, bool e None, que é o que json.loads retorna após o parsing.