Lire et analyser un fichier JSON depuis une URL en Python

Lire du JSON depuis une URL en Python transforme une réponse distante en données exploitables immédiatement. Récupérez la réponse avec urllib.request, puis passez son corps à json.loads pour obtenir un dictionnaire ou une liste. Ce pattern convient aux API publiques, aux fichiers de configuration hébergés et aux jeux de données qui évoluent indépendamment du code.

Exemple Python : Lire JSON depuis une URL

Sortie :

La sortie apparaîtra ici...

Sortie :

Squad: Super Hero Squad
Members: 3

Comment Fonctionne Cet Exemple

  1. urllib.request.urlopen(url) envoie un GET synchrone et retourne une réponse HTTP ; le bloc with ferme la connexion ensuite.
  2. response.read() retourne le corps en bytes bruts. json.loads accepte les bytes directement, donc aucun .decode("utf-8") manuel n’est nécessaire.
  3. Le parsing transforme l’objet JSON en un dict Python, indexé avec data["squadName"] et mesuré avec len(data["members"]).

Dans ce runtime, urlopen est synchrone, donc ni await ni asyncio ne sont nécessaires, même si de nombreux tutoriels enveloppent les appels réseau dans du code asynchrone.

json.load vs json.loads

Les deux fonctions désérialisent du JSON en objets Python ; la différence réside dans ce qu’elles lisent.

FonctionEntréeÀ utiliser quand
json.loads(...)une valeur str ou bytesle contenu est déjà en mémoire, comme response.read()
json.load(...)un objet fichier ou fluxon dispose d’un handle ouvert, comme open(path) ou la réponse elle-même

Ici json.loads(response.read()) et json.load(response) produisent le même dict. L’erreur habituelle est de passer le mauvais type : donner une chaîne à json.load ou un objet fichier à json.loads lève AttributeError ou TypeError.

Inspecter la Requête JSON dans Run Details

Ouvrez Run Details après la fin du programme. Il sépare la requête réseau du script des paquets chargés par le runtime pour l’exécuter.

Signal Run DetailsSignification
Requests affiche un GET vers raw.githubusercontent.com avec le statut 200Le fichier JSON a été récupéré sur le réseau avec succès
La durée de la requête en msCombien de temps a duré la récupération, séparément du parsing
La requête renvoie 403/404, est bloquée ou a échouéL’URL était inaccessible ou sans CORS, donc votre code n’a jamais été atteint
Packages est vide (“No runtime packages”)json et urllib sont bibliothèque standard, rien n’a été installé

La section Packages vide confirme que cette approche ne nécessite aucune installation. Les exemples qui importent beautifulsoup4 ou pandas listent ici un paquet chargé, comme l’exemple de web scraping ; lire du JSON avec la bibliothèque standard n’en liste aucun.

Lire depuis une URL dans le navigateur ne fonctionne que si l’endpoint envoie des en-têtes CORS. La fixture ci-dessus est un fichier CORS-compatible sur GitHub raw ; une URL cross-origin sans ces en-têtes est bloquée avant l’exécution du code, ce qui apparaît comme une requête échouée plutôt qu’une JSONDecodeError.

Erreurs Courantes lors de la Lecture de JSON depuis une URL

Erreur : lire le flux de réponse deux fois.

Incorrect :

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

Correct :

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

Pourquoi ça arrive : urlopen retourne un flux consommable une seule fois ; un second read() retourne des bytes vides.

Erreur : appeler .get() sur un tableau JSON parsé.

Incorrect :

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

Correct :

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

Pourquoi ça arrive : un tableau JSON de premier niveau est parsé en liste Python, qui n’a pas de .get ; il faut l’indexer.

Gestion des Erreurs et Clés Manquantes

urlopen lève HTTPError pour les réponses 4xx et 5xx, mais l’objet d’erreur reste lisible, donc un corps d’erreur JSON peut être parsé en le capturant avec 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())

Pour un champ optionnel, utilisez data.get("key") pour retourner None au lieu de lever KeyError. Le module json de la bibliothèque standard parse les entrées non fiables en toute sécurité, donc n’utilisez jamais eval() pour lire du JSON.

FAQ

Comment lire un fichier JSON en Python ?

Pour un fichier distant, ouvrez-le avec urllib.request.urlopen(url) et passez les bytes à json.loads. Pour un fichier sur disque, utilisez with open(path) as f: data = json.load(f). Les deux retournent un dict ou une liste Python.

Quelle est la différence entre json.load et json.loads ?

json.load lit depuis un objet fichier ou flux, tandis que json.loads lit depuis une valeur str ou bytes. Le “s” final signifie string. Utilisez loads quand vous avez déjà le contenu en mémoire.

Faut-il la bibliothèque requests pour lire du JSON en Python ?

Non. urllib.request et json sont tous deux bibliothèque standard, donc vous pouvez récupérer et parser du JSON sans aucune installation. La bibliothèque requests ajoute des commodités comme un helper .json() et la gestion de sessions, mais c’est une dépendance tierce.

Qu’est-ce que JSON en Python ?

JSON est un format texte pour les données structurées. Python mappe un objet JSON en dict, un tableau en liste et les primitives en str, int, float, bool et None — c’est ce que retourne json.loads après parsing.