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
urllib.request.urlopen(url)envía un GET síncrono y devuelve una respuesta HTTP; el bloquewithcierra la conexión después.response.read()devuelve el cuerpo como bytes sin procesar.json.loadsacepta bytes directamente, por lo que no se necesita un paso manual de.decode("utf-8").- El análisis convierte el objeto JSON en un dict de Python, que se indexa con
data["squadName"]y se mide conlen(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ón | Entrada | Úsela cuando |
|---|---|---|
json.loads(...) | un valor str o bytes | ya tiene el contenido en memoria, como response.read() |
json.load(...) | un objeto archivo o flujo | tiene 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 Details | Significado |
|---|---|
| Requests muestra un GET a raw.githubusercontent.com con estado 200 | El archivo JSON se obtuvo correctamente por la red |
| La duración de la solicitud en ms | Cuá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.