Zum Inhalt springen

Aufgabe 18 - JSON-Werkstatt - Die Mediendatenbank

Zu Zen-Modus wechseln

JSON ist das Austauschformat des Web und weit darüber hinaus: verschachtelt, selbstbeschreibend, überall lesbar. In dieser Übung arbeiten Sie mit einer echten verschachtelten Struktur, einer Mediendatenbank aus Projekten und deren Assets, und beherrschen den vollen Kreis: einlesen, durch die Verschachtelung navigieren, auswerten, umbauen und wieder als sauberes JSON schreiben (siehe Kapitel Dateien und Datenformate). Anders als eine flache CSV-Tabelle zwingt JSON dazu, mit Listen in Dictionaries in Listen sauber umzugehen; genau das ist die Kernkompetenz dieser Aufgabe.

  • Kapitel Dateien und Datenformate (das json-Modul, load/dump, indent, ensure_ascii); Kapitel Exceptions (eigene Exception-Klassen).
  • Die Datei library.json: ein Objekt mit dem Schlüssel projects (Liste). Jedes Projekt hat id, title, owner und assets (Liste); jedes Asset hat filename, type (image, video oder audio), size_mb, tags und je nach Typ weitere Felder. 6 Projekte, 26 Assets, darunter drei absichtlich inkonsistente (eines ohne size_mb, eines mit negativer Größe, eines mit unbekanntem type). Korrekt geladen ergibt das 23 assets loaded from 6 projects, 3 skipped.
  • Sie lesen und schreiben verschachteltes JSON mit dem Standardmodul, inklusive Encoding und lesbarer Formatierung.
  • Sie navigieren sicher durch ineinander verschachtelte Dictionaries und Listen und fangen fehlende Schlüssel kontrolliert ab.
  • Sie transformieren zwischen JSON-Strukturen (aggregieren, umgruppieren, zusammenführen) und weisen die Korrektheit der Ergebnisse nach.
  • Reproduktion: JSON laden, die Struktur beschreiben, Werte ausgeben (Teil A).
  • Reorganisation und Transfer: durch die Verschachtelung navigieren, Auswertungen entwickeln, in neue Strukturen umbauen (Teile B und C).
  • Reflexion, Problemlösung und Urteilsbildung: eine Validierung entwerfen, defektes JSON abfangen, zwei Quellen zusammenführen und die Formatwahl begründen (Teil D).

Die Übung ist auf etwa zwei Stunden ausgelegt. Teil D ist der Expertenteil.

  1. Öffnen Sie library.json zuerst im Editor. Beschreiben Sie die Struktur in zwei bis drei Sätzen: Welche Ebenen gibt es (Objekt → Liste → Objekt → Liste), und auf welcher Ebene stehen die eigentlichen Mediendateien?
  2. Laden Sie die Datei mit json.load (encoding="utf-8"). Welchen Python-Typ liefert die oberste Ebene, welchen data["projects"], welchen ein einzelnes Asset? Belegen Sie jede Antwort mit type().
  3. Geben Sie für jedes Projekt eine Zeile aus, Format p01 Imagefilm der Schule: 5 assets. Die Asset-Zahl gewinnen Sie aus len(...) der jeweiligen Asset-Liste.
  1. Schreiben Sie load_assets(path): liefert eine flache Liste aller Assets über alle Projekte hinweg. Jedes Asset bekommt dabei zusätzlich seine project_id und seinen owner aus der Ebene darüber mit (Rückgabe: Liste von Dictionaries). Das ist die typische Bewegung bei JSON: aus der Verschachtelung eine bearbeitbare, flache Sammlung gewinnen.
  2. Definieren Sie DataError(Exception) und validieren Sie beim Einsammeln: Ein Asset ist gültig, wenn filename, type und size_mb vorhanden sind, type in {"image", "video", "audio"} liegt und size_mb > 0 ist. Ungültige Assets werden übersprungen und mit project_id, filename und Grund in einer Fehlerliste gesammelt, nicht verschwiegen. Eine fehlende Datei führt zu DataError mit verständlicher Meldung.
  3. Ausgabe nach dem Laden: 23 assets loaded from 6 projects, 3 skipped plus die Details der übersprungenen Assets. Finden Sie alle drei präparierten Fehler?
  1. Berechnen Sie: Gesamtgröße (size_mb) je Projekt, Anzahl der Assets je type über die gesamte Bibliothek, sowie das größte Asset der Bibliothek (filename und Größe).
  2. Bauen Sie die Struktur um: Erzeugen Sie ein Dictionary by_type, das die gültigen Assets nach type gruppiert (Schlüssel image/video/audio, Wert je eine Liste der filenames). Das ist eine typische JSON-Umgruppierung, von “nach Projekt geordnet” zu “nach Typ geordnet”.
  3. Implementieren Sie save_summary(path, ...): schreibt die gesamte Auswertung als verschachteltes JSON (indent=2, ensure_ascii=False); Struktur etwa: je Projekt Größe und Asset-Zahl, Zählung je Typ, größtes Asset, die Gruppierung by_type.
  4. Schließen Sie den Kreis: Lesen Sie Ihr summary.json wieder ein und prüfen Sie zwei Stichprobenwerte mit assert gegen die Originalberechnung.

Teil D - Expertenteil: Fremde Daten, mehrere Quellen

Abschnitt betitelt „Teil D - Expertenteil: Fremde Daten, mehrere Quellen“
  1. Defektes JSON abfangen: Erzeugen Sie selbst eine syntaktisch kaputte Datei broken.json (etwa ein fehlendes Komma oder eine offene Klammer). Sorgen Sie dafür, dass load_assets bei einem Syntaxfehler nicht abstürzt, sondern einen DataError mit verständlicher Meldung auslöst (Hinweis: json.JSONDecodeError recherchieren).
  2. Schärfen Sie das Schema: tags muss eine Liste sein, size_mb eine Zahl (int oder float), filename darf nicht leer sein. Jede Verletzung landet mit präzisem Grund in der Fehlerliste. Testen Sie mit einem selbst hinzugefügten, absichtlich falschen Asset.
  3. Zwei Quellen zusammenführen: Erzeugen Sie selbst ein zweites Archiv library_extra.json mit ein bis zwei zusätzlichen Projekten. Schreiben Sie merge_libraries(a, b), das beide zu einer Bibliothek vereint; Projekte mit gleicher id dürfen nicht doppelt entstehen. Legen Sie fest, was in diesem Fall geschieht (überschreiben oder Assets zusammenführen), und begründen Sie die Wahl. Schreiben Sie das Ergebnis als library_merged.json.
  4. Beurteilen Sie in drei Sätzen: Wann ist JSON die bessere Wahl als CSV und wann umgekehrt? Nennen Sie je ein konkretes Merkmal dieser Mediendatenbank, das in einer einzelnen flachen CSV-Tabelle verloren ginge.
  1. Welche Python-Typen entstehen beim Einlesen aus einem JSON-Objekt, einem JSON-Array, einem JSON-String und einer JSON-Zahl?
  2. Wozu dient ensure_ascii=False beim Schreiben, und was passiert ohne diese Option mit Zeichen wie ä oder ß?
  3. Wie greifen Sie auf einen Schlüssel zu, der fehlen darf, ohne dass das Programm mit KeyError abstürzt?
  4. Warum lässt sich eine verschachtelte Struktur (Projekte mit ihren Assets) in JSON natürlich abbilden, in einer einzelnen CSV-Tabelle aber nicht?
  5. Worin unterscheiden sich JSONDecodeError und KeyError, und an welcher Stelle des Ablaufs tritt jeder auf?

media.py (Laden mit Validierung, Auswertung, Umbau, Export und Merge), das erzeugte summary.json und library_merged.json, die selbst erzeugten Dateien broken.json und library_extra.json sowie ein kurzes Protokoll: Welche drei inkonsistenten Assets wurden gefunden und mit welcher Begründung? Committet im Git-Repository.