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

  1. urllib.request.urlopen(url) envia um GET síncrono e retorna uma resposta HTTP; o bloco with fecha a conexão em seguida.
  2. response.read() retorna o corpo como bytes brutos. json.loads aceita bytes diretamente, portanto nenhum passo manual de .decode("utf-8") é necessário.
  3. O parsing converte o objeto JSON em um dict Python, indexado com data["squadName"] e medido com len(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çãoEntradaUse quando
json.loads(...)um valor str ou byteso conteúdo já está em memória, como response.read()
json.load(...)um objeto arquivo ou fluxohá 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 DetailsSignificado
Requests mostra um GET para raw.githubusercontent.com com status 200O arquivo JSON foi obtido pela rede com sucesso
A duração da requisição em msQuanto tempo levou a busca, separado do parsing
A requisição retornou 403/404, foi bloqueada ou falhouA 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.