CodeGym /Java Kurs /Python SELF DE /Arbeiten mit JSON über json

Arbeiten mit JSON über json

Python SELF DE
Level 23 , Lektion 1
Verfügbar

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: Wenn True, werden Schlüssel übersprungen, die keine Strings, Zahlen oder None sind.
  • ensure_ascii: Wenn True, 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: Wenn True, 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)
    
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION