Leer y Analizar un Archivo JSON desde una URL en Python

Leer JSON desde una URL en Python convierte una respuesta remota en datos con los que puede trabajar de inmediato. Obtenga la respuesta con urllib.request y pase el cuerpo a json.loads para obtener un diccionario o una lista. Este patrón es ideal para APIs públicas, archivos de configuración alojados y conjuntos de datos que cambian independientemente del código.

Ejemplo Python: Leer JSON desde una URL

Salida:

La salida aparecerá aquí...

Salida:

Squad: Super Hero Squad
Members: 3

Cómo Funciona Este Ejemplo

  1. urllib.request.urlopen(url) envía un GET síncrono y devuelve una respuesta HTTP; el bloque with cierra la conexión después.
  2. response.read() devuelve el cuerpo como bytes sin procesar. json.loads acepta bytes directamente, por lo que no se necesita un paso manual de .decode("utf-8").
  3. El análisis convierte el objeto JSON en un dict de Python, que se indexa con data["squadName"] y se mide con len(data["members"]).

En este runtime urlopen es síncrono, por lo que no necesita await ni asyncio, aunque muchos tutoriales envuelven las llamadas de red en código asíncrono.

json.load vs json.loads

Ambas funciones deserializan JSON en objetos Python; la diferencia está en de dónde leen.

FunciónEntradaÚsela cuando
json.loads(...)un valor str o bytesya tiene el contenido en memoria, como response.read()
json.load(...)un objeto archivo o flujotiene un identificador abierto, como open(path) o la respuesta misma

Aquí json.loads(response.read()) y json.load(response) producen el mismo dict. El error habitual es pasar el tipo incorrecto: dar una cadena a json.load o un objeto archivo a json.loads lanza AttributeError o TypeError.

Inspeccionar la Solicitud JSON en Run Details

Abra Run Details después de que el programa finalice. Separa la solicitud de red del script de los paquetes que el runtime cargó para ejecutarlo.

Señal de Run DetailsSignificado
Requests muestra un GET a raw.githubusercontent.com con estado 200El archivo JSON se obtuvo correctamente por la red
La duración de la solicitud en msCuánto tardó la descarga, separada del análisis
La solicitud devuelve 403/404, está bloqueada o fallóLa URL no era accesible o no tiene CORS habilitado, por lo que no llegó al código
Packages está vacío (“No runtime packages”)json y urllib son biblioteca estándar, no se instaló nada

La sección Packages vacía confirma que este enfoque no requiere instalación. Los ejemplos que importan beautifulsoup4 o pandas listan un paquete cargado aquí, como el ejemplo de web scraping; leer JSON con la biblioteca estándar no lista ninguno.

Leer desde una URL en el navegador solo funciona cuando el endpoint envía cabeceras CORS. El archivo del ejemplo es un archivo CORS habilitado en GitHub raw; una URL de origen cruzado sin esas cabeceras es bloqueada antes de que su código se ejecute, lo que aparece como una solicitud fallida en lugar de un JSONDecodeError.

Errores Comunes al Leer JSON desde una URL

Error: leer el flujo de respuesta dos veces.

Incorrecto:

raw = response.read()
data = json.loads(response.read())

Correcto:

data = json.loads(response.read())

Por qué ocurre: urlopen devuelve un flujo que se consume una vez; un segundo read() devuelve bytes vacíos.

Error: llamar a .get() en un array JSON analizado.

Incorrecto:

data = json.loads(response.read())
first = data.get("name")

Correcto:

data = json.loads(response.read())
first = data[0] if isinstance(data, list) else data["name"]

Por qué ocurre: un array JSON de nivel superior se analiza como una lista de Python, que no tiene .get; debe indexarse.

Manejo de Errores y Claves Ausentes

urlopen lanza HTTPError para respuestas 4xx y 5xx, pero el objeto de error sigue siendo legible, por lo que un cuerpo de error JSON puede analizarse capturándolo con 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 un campo opcional, use data.get("key") para devolver None en lugar de lanzar KeyError. El módulo json de la biblioteca estándar analiza entradas no confiables de forma segura, por lo que nunca use eval() para leer JSON.

FAQ

¿Cómo se lee un archivo JSON en Python?

Para un archivo remoto, ábralo con urllib.request.urlopen(url) y pase los bytes a json.loads. Para un archivo en disco, use with open(path) as f: data = json.load(f). Ambos devuelven un dict o una lista de Python.

¿Cuál es la diferencia entre json.load y json.loads?

json.load lee de un objeto archivo o flujo, mientras que json.loads lee de un valor str o bytes. La “s” final significa string. Use loads cuando ya tenga el contenido en memoria.

¿Necesita la biblioteca requests para leer JSON en Python?

No. urllib.request y json son ambas biblioteca estándar, por lo que puede obtener y analizar JSON sin ninguna instalación. La biblioteca requests añade conveniencias como un helper .json() y gestión de sesiones, pero es una dependencia de terceros.

¿Qué es JSON en Python?

JSON es un formato de texto para datos estructurados. Python convierte un objeto JSON en un dict, un array en una lista, y los primitivos en str, int, float, bool y None, que es lo que devuelve json.loads después de analizar.