Parsen von JSON in Python

In diesem Tutorial zeigen wir Ihnen, wie Sie json importieren und damit JSON in Python parsen können. Dazu gibt es eine nützliche JSON-Python-Umwandlungstabelle. Unabhängig davon, ob Sie ein erfahrener Python-Entwickler sind oder sich gerade erst einarbeiten, hier lernen Sie Schritt für Schritt, JSON wie ein Profi zu parsen!
11 min read
How to parse JSON data with Python

Dieses Tutorial vermittelt Ihnen Folgendes:

Einführung: JSON in Python

Bevor wir uns mit dem Parsen von JSON in Python beschäftigen, muss klar sein, was JSON genau ist und wie man es in Python verwendet.

Was ist JSON?

JSON, kurz für JavaScript Object Notation, ist ein kompaktes Format für den Datenaustausch. Das Format ist für den Menschen einfach zu lesen und zu schreiben und lässt sich von Maschinen mühelos parsen und generieren. Daher zählt es zu den beliebtesten Datenformaten. JSON hat sich zur “Sprache des Webs” entwickelt, da es weithin für die Übertragung von Daten zwischen Servern und Webanwendungen über APIs verwendet wird.  

Hier sehen Sie ein Beispiel für JSON:


{
  "name": "Maria Smith",
  "age": 32,
  "isMarried": true,
  "hobbies": ["reading", "jogging"],
  "address": {
    "street": "123 Main St",
    "city": "San Francisco",
    "state": "CA",
    "zip": "12345"
  },
  "phoneNumbers": [
    {
      "type": "home",
      "number": "555-555-1234"
    },
    {
      "type": "work",
      "number": "555-555-5678"
    }
  ],
  "notes": null
}

Wie Sie feststellen können, besteht JSON aus Schlüssel-Werte-Paaren. Jeder Schlüssel ist eine Zeichenkette und jeder Wert kann eine Zeichenkette, eine Zahl, ein boolescher Wert, ein Nullwert, ein Array oder ein Objekt sein. Auch wenn JSON einem JavaScript-Objekt ähnelt, kann es mit jeder beliebigen Programmiersprache (einschließlich Python) verwendet werden.

Umgang mit JSON in Python

Python unterstützt JSON von Haus aus durch das json-Modul, welches Bestandteil der Python-Standardbibliothek ist. Um mit JSON in Python zu arbeiten, müssen Sie also keine zusätzliche Bibliothek installieren. Sie können json wie folgt importieren:  

import json

Die in Python integrierte json-Bibliothek liefert eine vollständige API für die Arbeit mit JSON. Sie besitzt zwei Schlüsselfunktionen: loads und load. Mit der Funktion loads können Sie JSON-Daten aus einer Zeichenkette parsen. Beachten Sie, dass die Endung „s“ für „String“ steht, auch wenn es den Anschein hat, dass es sich um einen Plural handelt. Der Name sollte deshalb als „load-s“ gelesen werden. Die load-Funktion dient hingegen zum Parsen von JSON-Daten in Bytes.  

Anhand dieser beiden Methoden ermöglicht json die Konvertierung von JSON-Daten in äquivalente Python-Objekte wie Wörterbücher und Listen und umgekehrt. Zudem erlaubt das json-Modul die Erstellung benutzerdefinierter Kodierer und Dekodierer zur Verarbeitung bestimmter Datentypen.  

Lesen Sie weiter, um zu erfahren, wie Sie die json-Bibliothek zum Parsen von JSON-Daten in Python verwenden können!  

Parsen von JSON-Daten mit Python

Sehen wir uns nun einige Praxisbeispiele an, um zu verstehen, wie man JSON-Daten aus verschiedenen Quellen in verschiedene Python-Datenstrukturen parsen kann.

Umwandlung eines JSON-Strings in ein Python-Wörterbuch

Nehmen wir an, Sie haben einige JSON-Daten in einer Zeichenkette gespeichert und möchten diese in ein Python-Wörterbuch konvertieren. So sehen die JSON-Daten aus:  

{
  "name": "iPear 23",
  "colors": ["black", "white", "red", "blue"],
  "price": 999.99,
  "inStock": true
}

Und so sieht die String-Darstellung in Python aus:

smartphone_json = '{"name": "iPear 23", "colors": ["black", "white", "red", "blue"], "price": 999.99, "inStock": true}'

Erwägen Sie die Verwendung der Python-Konvention der dreifachen Anführungszeichen, um lange mehrzeilige JSON-Strings zu speichern.

Anhand der folgenden Zeile können Sie überprüfen, ob smartphone eine gültige Python-Zeichenkette enthält:

print(type(smartphone))

Die Ausgabe lautet wie folgt:

<class 'str'>

str ist die Abkürzung für „string“ und bedeutet, dass die smartphone-Variable dem Typ „Textsequenz“ angehört.  

Parsen Sie die in smartphone enthaltene JSON-Zeichenkette mit der Methode json.loads() wie folgt in ein Python-Wörterbuch:

import json

# JSON string
smartphone_json = '{"name": "iPear 23", "colors": ["black", "white", "red", "blue"], "price": 999.99, "inStock": true}'
# from JSON string to Python dict
smartphone_dict = json.loads(smartphone_json)

# verify the type of the resulting variable
print(type(smartphone_dict)) # dict

Bei Ausführung dieses Schnipsels erhalten Sie:

<class 'dict'>

Großartig! smartphone_dict enthält jetzt ein gültiges Python-Wörterbuch!  

Um einen JSON-String in ein Python-Wörterbuch umzuwandeln, müssen Sie also lediglich einen gültigen JSON-String an json.loads() übertragen.

Nun können Sie wie gewohnt auf die resultierenden Wörterbuchfelder zugreifen:

product = smartphone_dict['product'] # smartphone
priced = smartphone['price'] # 999.99
colors = smartphone['colors'] # ['black', 'white', 'red', 'blue']

Beachten Sie, dass die Funktion json.loads() nicht in jedem Fall ein Wörterbuch zurückgibt. Der zurückgegebene Datentyp hängt insbesondere von der Eingabezeichenfolge ab. Enthält die JSON-Zeichenkette zum Beispiel einen Pauschalwert, so wird dieser in den entsprechenden einfachen Python-Wert umgewandelt:

import json
 
json_string = '15.5'
float_var = json.loads(json_string)

print(type(float_var)) # <class 'float'>

In ähnlicher Weise wird ein JSON-String, der eine Array-Liste enthält, zu einer Python-Liste:


import json
 
json_string = '[1, 2, 3]'
list_var = json.loads(json_string)
print(json_string) # <class 'list'>

Werfen Sie einen Blick auf die Konversionstabelle unten, um zu sehen, wie JSON-Werte durch json in Python-Daten umgewandelt werden:

JSON-Wert  Python-Daten  
stringstr
number (integer)int
number (real)float
trueTrue
falseFalse
nullNone
arraylist
objectdict

Umwandlung einer JSON-API-Antwort in ein Python-Wörterbuch

Angenommen, Sie müssen eine API erstellen und deren JSON-Antwort in ein Python-Wörterbuch umwandeln. Im folgenden Beispiel wird der folgende API-Endpunkt aus dem Projekt {JSON} Placeholder aufgerufen, um einige fingierte JSON-Daten zu erhalten:

https://jsonplaceholder.typicode.com/todos/1

Die RESTFul-API liefert die folgende JSON-Antwort:

{
  "userId": 1,
  "id": 1,
  "title": "delectus aut autem",
  "completed": false
}

Sie können diese API mit dem urllib-Modul aus der Standardbibliothek aufrufen und das resultierende JSON wie folgt in ein Python-Wörterbuch umwandeln:

import urllib.request
import json

url = "https://jsonplaceholder.typicode.com/todos/1"

with urllib.request.urlopen(url) as response:
     body_json = response.read()

body_dict = json.loads(body_json)
user_id = body_dict['userId'] # 1

urllib.request.urlopen() führt den API-Aufruf aus und gibt ein HTTPResponse-Objekt zurück. Anschließend wird seine read()-Methode verwendet, um den Antwortkörper body_json zu erhalten, welcher die API-Antwort als JSON-String enthält. Dann kann diese Zeichenkette, wie bereits erläutert, mithilfe von json.loads() in ein Python-Wörterbuch geparst werden.

Analog dazu können Sie dasselbe Ergebnis mithilfe von requests erzielen:

import requests
import json

url = "https://jsonplaceholder.typicode.com/todos/1"
response = requests.get(url)

body_dict = response.json()
user_id = body_dict['userId'] # 1

Beachten Sie, dass die .json() Methode das Antwortobjekt, das JSON-Daten enthält, automatisch in die entsprechende Python-Datenstruktur umwandelt

Klasse! Jetzt wissen Sie, wie man sowohl mit urllib als auch mit requests eine JSON-API-Antwort in Python parsen kann.

Laden einer JSON-Datei in ein Python-Wörterbuch

Nehmen wir an, Sie haben einige JSON-Daten in einer smartphone.json-Datei wie folgt gespeichert:

{
  "name": "iPear 23",
  "colors": ["black", "white", "red", "blue"],
  "price": 999.99,
  "inStock": true,
  "dimensions": {
    "width": 2.82,
    "height": 5.78,
    "depth": 0.30
  },
  "features": [
    "5G",
    "HD display",
    "Dual camera"
  ]
}

Sie möchten nun die JSON-Datei lesen und sie in ein Python-Wörterbuch laden. Dies wird mit dem folgenden Schnipsel erreicht:

import json

with open('smartphone.json') as file:
  smartphone_dict = json.load(file)

print(type(smartphone_dict)) # <class 'dict'>
features = smartphone_dict['features'] # ['5G', 'HD display', 'Dual camera']

Die integrierte open()-Bibliothek macht es möglich, eine Datei zu laden und das entsprechende Dateiobjekt zu erhalten. Daraufhin deserialisiert die Methode json.read() die ein JSON-Dokument enthaltende Textdatei bzw. Binärdatei in das entsprechende Python-Objekt. In diesem Fall wird smartphone.json in ein Python-Wörterbuch umgewandelt.

Einfach genial: Das Parsen einer JSON-Datei in Python erfordert nur wenige Zeilen Code!

Von JSON-Daten zum benutzerdefinierten Python-Objekt

Nun wollen wir einige JSON-Daten in eine benutzerdefinierte Python-Klasse parsen. So sieht Ihre benutzerdefinierte Smartphone-Python-Klasse aus:

class Smartphone:
    def __init__(self, name, colors, price, in_stock):
        self.name = name    
        self.colors = colors
        self.price = price
        self.in_stock = in_stock

Hier gilt es, den folgenden JSON-String in eine Smartphone-Instanz umzuwandeln:

{
  "name": "iPear 23 Plus",
  "colors": ["black", "white", "gold"],
  "price": 1299.99,
  "inStock": false
}

Um dies zu erreichen, müssen Sie einen benutzerdefinierten Decoder erstellen. Dazu müssen Sie die Klasse JSONDecoder erweitern und den Parameter object_hook in der Methode __init__ festlegen . Weisen Sie ihm den Namen der Klassenmethode zu, die die benutzerdefinierte Parsing-Logik enthält. In dieser Parsing-Methode können Sie die Werte aus dem von json.read() ausgegebenen Standardwörterbuch verwenden und so ein Smartphone-Objekt instanziieren.

Definieren Sie einen benutzerdefinierten SmartphoneDecoder wie nachstehend angegeben:

import json
 
class SmartphoneDecoder(json.JSONDecoder):
    def __init__(self, object_hook=None, *args, **kwargs):
        # set the custom object_hook method
        super().__init__(object_hook=self.object_hook, *args, **kwargs)

    # class method containing the 
    # custom parsing logic
    def object_hook(self, json_dict):
        new_smartphone = Smartphone(
            json_dict.get('name'), 
            json_dict.get('colors'), 
            json_dict.get('price'),
            json_dict.get('inStock'),            
        )

        return new_smartphone

Beachten Sie dabei, dass die Wörterbuchwerte mit der get()-Methode in der benutzerdefinierten object_hook()-Methode gelesen werden sollten. Auf diese Weise wird sichergestellt, dass keine KeyErrors ausgelöst werden, wenn ein Schlüssel im Wörterbuch fehlt. Stattdessen wird der Wert None zurückgegeben.

Jetzt können Sie die SmartphoneDecoder-Klasse an den cls-Parameter in json.loads() übergeben, um einen JSON-String in ein Smartphone-Objekt umzuwandeln:

import json

# class Smartphone:
# ...

# class SmartphoneDecoder(json.JSONDecoder): 
# ...

smartphone_json = '{"name": "iPear 23 Plus", "colors": ["black", "white", "gold"], "price": 1299.99, "inStock": false}'

smartphone = json.loads(smartphone_json, cls=SmartphoneDecoder)
print(type(smartphone)) # <class '__main__.Smartphone'>
name = smartphone.name # iPear 23 Plus

Analog dazu können Sie SmartphoneDecoder mit json.load()verwenden:

smartphone = json.load(smartphone_json_file, cls=SmartphoneDecoder)

Et voilà! Nun wissen Sie, wie JSON-Daten in benutzerdefinierte Python-Objekte geparst werden können!

Python-Daten in JSON

Sie können auch umgekehrt vorgehen und Python-Datenstrukturen und primitive Variablen in JSON umwandeln. Ermöglicht wird dies durch die Funktionen json.dump() und json.dumps(),die der nachstehenden Umrechnungstabelle folgen:

Python-Daten  JSON-Wert  
strstring 
intnumber (integer)
floatnumber (real)
Truetrue
False false
None null 
listarray
dictobject
Null None (Keiner)

json.dump() erlaubt es Ihnen, einen JSON-String in eine Datei zu schreiben (siehe folgendes Beispiel):

import json

user_dict = {
    "name": "John",
    "surname": "Williams",
    "age": 48,
    "city": "New York"
}

# serializing the sample dictionary to a JSON file
with open("user.json", "w") as json_file:
    json.dump(user_dict, json_file)

Über dieses Schnipsel wird die Python-Variable user_dict in die Datei user.json serialisiert.

Gleichermaßen wandelt json.dumps() eine Python-Variable in die entsprechende JSON-Zeichenkette um:

import json

user_dict = {
    "name": "John",
    "surname": "Williams",
    "age": 48,
    "city": "New York"
}

user_json_string = json.dumps(user_dict)

print(user_json_string)

Bei Ausführung dieses Schnipsels erhalten Sie Folgendes:

Das ist die exakte JSON-Darstellung des Python-Wörterbuchs.

Beachten Sie, dass Sie auch einen benutzerdefinierten Kodierer angeben können (allerdings wird in diesem Artikel nicht erklärt, wie das geht). In der offiziellen Dokumentation finden Sie nähere Informationen dazu.

Ist das json-Standardmodul die beste Ressource zum Parsen von JSON in Python

Wie beim Parsen von Daten im Allgemeinen gibt es auch beim Parsen von JSON gewisse Hindernisse, die nicht ignoriert werden sollten. Beispielsweise würde das Python-Modul json bei ungültigem, fehlerhaftem oder nicht standardisiertem JSON versagen.

Vorsicht ist auch beim Parsen von JSON-Daten aus nicht vertrauenswürdigen Quellen geboten. Ein schädlicher JSON-String kann nämlich dazu führen, dass Ihr Parser zusammenbricht oder eine große Menge an Ressourcen verbraucht. Dies ist nur eine der Herausforderungen, die beim JSON-Parsing in Python berücksichtigt werden müssen.

Für diese besonderen Fälle könnten Sie eine eigene Logik einführen. Dies könnte jedoch zu lange dauern und in einem komplexen und unzuverlässigen Code resultieren. Daher sollten Sie ein professionelles Tool wie Web Scraper IDE in Betracht ziehen, das das Parsen von JSON erleichtert.  

Web Scraping IDE wurde speziell für Entwickler konzipiert und bietet eine Vielzahl von Funktionen zum Parsen von JSON-Inhalten und mehr. Dieses Tool erspart Ihnen eine Menge Zeit und unterstützt Sie bei der sicheren Durchführung Ihres JSON-Parsing-Prozesses. Außerdem verfügt es über die Unblocking-Proxy-Funktionen von Bright Data, die es ermöglichen, JSON-APIs anonym aufzurufen.

Falls Sie es eilig haben, dürfte Sie auch unser DaaS-Angebot (Data as a Service) interessieren. Dieser Service ermöglicht es Ihnen, Bright Data mit der Bereitstellung eines maßgeschneiderten Datensatzes zu beauftragen, der Ihren spezifischen Anforderungen entspricht. Dabei kümmert sich Bright Data um alle Belange – von der Performance bis hin zur Datenqualität.  

Das Parsen von JSON-Daten war noch nie so einfach!

Fazit

Mithilfe des json-Standardmoduls können Sie in Python JSON-Daten nativ parsen. Dadurch wird eine leistungsfähige API zur Serialisierung und Deserialisierung von JSON-Inhalten bereitgestellt. Insbesondere stehen die Methoden json.read() und json.reads() zur Verfügung, um JSON-Dateien bzw. JSON-Strings zu verarbeiten. In diesem Tutorial haben Sie anhand mehrerer Praxisbeispiele gesehen, wie diese zum Parsen von JSON-Daten in Python verwendet werden können. Darüber hinaus haben Sie auch die Grenzen dieser Vorgehensweise kennen gelernt. Aus diesem Grund sollten Sie eine hochmoderne, voll funktionsfähige kommerzielle Lösung für das Parsen von Daten ausprobieren, wie z. B. Web Scraper IDE von Bright Data.