2.1 Modul json
JSON (JavaScript Object Notation) ist ein leichtgewichtiges Datenformat, das einfach von Menschen gelesen und geschrieben werden kann und ebenso leicht von Computern analysiert und generiert werden kann. JSON wird häufig zur Datenübertragung zwischen einem Server und einer Webanwendung sowie zur Speicherung von Konfigurationen und Einstellungen verwendet.
Das Modul json
in Python bietet Funktionen zur Serialisierung
(Umwandlung von Python-Objekten in JSON-Strings) und Deserialisierung
(Umwandlung von JSON-Strings in Python-Objekte). Dieses Modul ist Teil der
Standardbibliothek von Python und wird aktiv für die Arbeit mit
JSON-Daten verwendet.
Die Hauptfunktionen des Moduls json
ähneln sehr denen von
pickle
und funktionieren ähnlich. Was erwartet ihr —
Standard!
-
Arbeiten mit Strings:
-
json.dumps(obj)
— Konvertiert ein Python-Objekt in einen JSON-String. -
json.loads(s)
— Konvertiert einen JSON-String in ein Python-Objekt.
-
-
Arbeiten mit Dateien:
-
json.dump(obj, file)
— Serialisiert ein Python-Objekt und schreibt es in eine Textdatei. -
json.load(file)
— Deserialisiert ein Python-Objekt aus einer Textdatei, die Daten im JSON-Format enthält.
-
Lasst uns ein paar Beispiele betrachten, um uns die Funktionsweise dieser Funktionen besser einzuprägen.
2.2 Serialisierung in einen String
Serialisierung von Python-Objekten in JSON-Strings
Um ein Objekt in einen String zu serialisieren, muss man es einfach an die Funktion
json.dumps()
übergeben.
import json
# Beispielobjekt zur Serialisierung
data = {
"name": "Alice",
"age": 30,
"is_student": False,
"courses": ["Math", "Science"],
"address": {
"city": "New York",
"zip_code": "10001"
}
}
# Konvertierung eines Python-Objekts in einen JSON-String
json_string = json.dumps(data, indent=4)
print("Serialisierte Daten (JSON):", json_string)
Deserialisierung von JSON-Strings in Python-Objekte
Um ein Objekt aus einem String zu erhalten, muss man den JSON-String,
der eine Beschreibung des Objekts enthält, an die Methode json.loads()
übergeben.
import json
# Beispiel eines JSON-Strings zur Deserialisierung
json_string = '''
{
"name": "Alice",
"age": 30,
"is_student": false,
"courses": ["Math", "Science"],
"address": {
"city": "New York",
"zip_code": "10001"
}
}
'''
# Konvertierung eines JSON-Strings in ein Python-Objekt
data = json.loads(json_string)
print("Deserialisierte Daten (Python):", data)
2.3 Serialisierung in eine Datei
Speichern von Python-Objekten in einer Datei im JSON-Format
Um ein Objekt in eine Datei zu schreiben, muss man die Methode
json.dump()
aufrufen. Beim Arbeiten mit Dateien ist es wichtig, Fehlermanagement zu verwenden,
um mögliche Fehler korrekt zu behandeln. Hier ist ein Beispiel:
import json
# Beispielobjekt zur Serialisierung
data = {
"name": "Bob",
"age": 25,
"is_student": True,
"courses": ["History", "Literature"],
"address": {
"city": "Los Angeles",
"zip_code": "90001"
}
}
# Speichern eines Python-Objekts in einer JSON-Datei mit Fehlermanagement
try:
with open('data.json', 'w') as file:
json.dump(data, file, indent=4)
print("Daten erfolgreich in Datei geschrieben.")
except IOError:
print("Fehler beim Schreiben in die Datei.")
except json.JSONEncodeError:
print("Fehler bei der JSON-Kodierung.")
Lesen von Python-Objekten aus einer Datei im JSON-Format
Das Lesen ist auch sehr einfach — einfach die Datei an die Methode
json.load()
übergeben. Auch hier ist es wichtig, Fehlermanagement zu verwenden:
import json
# Lesen eines Python-Objekts aus einer JSON-Datei mit Fehlermanagement
try:
with open('data.json', 'r') as file:
data = json.load(file)
print("Deserialisierte Daten aus Datei (Python):", data)
except IOError:
print("Fehler beim Lesen der Datei.")
except json.JSONDecodeError:
print("Fehler beim Dekodieren von JSON.")
2.4 Zusätzliche Parameter der Funktionen
An die Funktion zur Serialisierung können zusätzliche Parameter übergeben werden, die dein JSON schöner machen:
-
skipkeys
: WennTrue
, werden Schlüssel übersprungen, die keine Strings, Zahlen oderNone
sind. -
ensure_ascii
: WennTrue
, werden alle Nicht-ASCII-Zeichen mit Hilfe von Unicode-Escape-Sequenzen maskiert. -
indent
: Wenn eine Zahl angegeben ist, werden Einrückungen für eine bessere Lesbarkeit hinzugefügt. -
sort_keys
: WennTrue
, werden die Schlüssel im JSON alphabetisch sortiert.
Beispiel für die Verwendung von Parametern mit json.dumps()
:
import json
data = {"c": 3, "b": 2, "a": 1}
# Serialisierung mit Sortieren der Schlüssel und Einrückungen
json_string = json.dumps(data, indent=4, sort_keys=True)
print(json_string)
2.5 Benutzerdefinierte Dekoder und Kodierer
Das Modul json
erlaubt die Verwendung von benutzerdefinierten Funktionen
zur Serialisierung und Deserialisierung von Objekten.
Beispiel eines benutzerdefinierten Kodierers
Zuerst erstellen wir eine spezielle Kodierklasse, die intern
überprüft, ob
wenn der Objekttyp == datetime, dann wird das Objekt als String im
ISO-Format zurückgegeben
.
import json
from datetime import datetime
class CustomEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime):
return obj.isoformat()
return super().default(obj)
data = {
"name": "Alice",
"timestamp": datetime.now()
}
# Serialisierung mit benutzerdefiniertem Kodierer
json_string = json.dumps(data, cls=CustomEncoder, indent=4)
print(json_string)
Beispiel eines benutzerdefinierten Dekoders
Für die umgekehrte Operation brauchen wir auch eine Funktion, die den String
in ein Datum umwandelt. Zum Beispiel kann man einfach
den Feldnamen überprüfen, und wenn es timestamp heißt, den
String in ein datetime-Objekt umwandeln
:
import json
from datetime import datetime
def custom_decoder(dct):
if 'timestamp' in dct:
dct['timestamp'] = datetime.fromisoformat(dct['timestamp'])
return dct
json_string = '''
{
"name": "Alice",
"timestamp": "2023-05-15T14:30:00"
}
'''
# Deserialisierung mit benutzerdefiniertem Dekoder
data = json.loads(json_string, object_hook=custom_decoder)
print(data)
GO TO FULL VERSION