JSON-Datei von URL in Python lesen und parsen

Das Lesen von JSON aus einer URL in Python wandelt eine Remote-Antwort sofort in nutzbare Daten um. Die Antwort wird mit urllib.request geladen und der Body an json.loads übergeben, um ein Dictionary oder eine Liste zu erhalten. Dieses Muster eignet sich für öffentliche APIs, gehostete Konfigurationsdateien und Datensätze, die sich unabhängig vom Code ändern.

Python JSON von URL lesen – Beispiel

Ausgabe:

Die Ausgabe erscheint hier...

Ausgabe:

Squad: Super Hero Squad
Members: 3

So Funktioniert Dieses Beispiel

  1. urllib.request.urlopen(url) sendet einen synchronen GET-Request und gibt eine HTTP-Antwort zurück; der with-Block schließt die Verbindung anschließend.
  2. response.read() gibt den Body als Raw-Bytes zurück. json.loads akzeptiert Bytes direkt, sodass kein manuelles .decode("utf-8") nötig ist.
  3. Das Parsen wandelt das JSON-Objekt in ein Python-Dict um, das mit data["squadName"] indiziert und mit len(data["members"]) gemessen wird.

In diesem Runtime ist urlopen synchron, daher wird weder await noch asyncio benötigt, auch wenn viele Tutorials Netzwerkaufrufe in asynchronen Code einbetten.

json.load vs. json.loads

Beide Funktionen deserialisieren JSON in Python-Objekte; der Unterschied liegt darin, woraus sie lesen.

FunktionEingabeVerwenden, wenn
json.loads(...)ein str- oder bytes-Wertder Inhalt bereits im Speicher vorliegt, z. B. response.read()
json.load(...)ein Datei- oder Stream-Objektein offenes Handle vorhanden ist, z. B. open(path) oder die Antwort selbst

Hier liefern json.loads(response.read()) und json.load(response) das gleiche Dict. Der typische Fehler ist der falsche Typ: einen String an json.load oder ein Dateiobjekt an json.loads zu übergeben, löst AttributeError oder TypeError aus.

JSON-Anfrage in Run Details Prüfen

Öffnen Sie Run Details nach dem Programmende. Es trennt die Netzwerkanfrage des Skripts von den Paketen, die die Laufzeit zur Ausführung geladen hat.

Run Details-SignalBedeutung
Requests zeigt einen GET auf raw.githubusercontent.com mit Status 200Die JSON-Datei wurde erfolgreich über das Netzwerk geladen
Anfragedauer in msWie lange der Abruf dauerte, unabhängig vom Parsen
Request ist 403/404, blockiert oder fehlgeschlagenDie URL war nicht erreichbar oder ohne CORS; der Code wurde nie erreicht
Packages ist leer (“No runtime packages”)json und urllib sind Standardbibliothek, nichts wurde installiert

Der leere Packages-Bereich bestätigt, dass dieser Ansatz ohne Installation auskommt. Beispiele, die beautifulsoup4 oder pandas importieren, listen hier ein geladenes Paket, z. B. das Web-Scraping-Beispiel; das Lesen von JSON mit der Standardbibliothek zeigt nichts.

Das Lesen einer URL im Browser funktioniert nur, wenn der Endpunkt CORS-Header sendet. Die obige Fixture ist eine CORS-fähige Datei auf GitHub raw; eine Cross-Origin-URL ohne diese Header wird vor der Codeausführung blockiert, was als fehlgeschlagene Anfrage und nicht als JSONDecodeError erscheint.

Häufige Fehler beim Lesen von JSON aus einer URL

Fehler: den Response-Stream zweimal lesen.

Falsch:

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

Richtig:

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

Warum es passiert: urlopen gibt einen Stream zurück, der einmal konsumiert wird; ein zweites read() gibt leere Bytes zurück.

Fehler: .get() auf einem geparsten JSON-Array aufrufen.

Falsch:

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

Richtig:

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

Warum es passiert: Ein JSON-Array der obersten Ebene wird zu einer Python-Liste geparst, die kein .get hat; man muss sie indizieren.

Fehlerbehandlung und Fehlende Schlüssel

urlopen löst HTTPError bei 4xx- und 5xx-Antworten aus, aber das Fehlerobjekt ist weiterhin lesbar, sodass ein JSON-Fehlerbody durch Abfangen mit try/except geparst werden kann:

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())

Für ein optionales Feld verwenden Sie data.get("key"), um None statt KeyError zu erhalten. Das Standardbibliotheksmodul json parst nicht vertrauenswürdige Eingaben sicher, daher niemals eval() für JSON verwenden.

FAQ

Wie liest man eine JSON-Datei in Python?

Für eine Remote-Datei öffnen Sie sie mit urllib.request.urlopen(url) und übergeben die Bytes an json.loads. Für eine Datei auf der Festplatte verwenden Sie with open(path) as f: data = json.load(f). Beide geben ein Python-Dict oder eine Liste zurück.

Was ist der Unterschied zwischen json.load und json.loads?

json.load liest aus einem Datei- oder Stream-Objekt, während json.loads aus einem str- oder bytes-Wert liest. Das abschließende „s” steht für String. Verwenden Sie loads, wenn der Inhalt bereits im Speicher vorhanden ist.

Braucht man die requests-Bibliothek zum Lesen von JSON in Python?

Nein. urllib.request und json sind beide Standardbibliothek, sodass JSON ohne jede Installation geladen und geparst werden kann. Die requests-Bibliothek fügt Komfortfunktionen wie einen .json()-Helfer und Session-Verwaltung hinzu, ist aber eine Drittanbieter-Abhängigkeit.

Was ist JSON in Python?

JSON ist ein Textformat für strukturierte Daten. Python wandelt ein JSON-Objekt in ein Dict um, ein Array in eine Liste und die Primitiven in str, int, float, bool und None — genau das gibt json.loads nach dem Parsen zurück.