0%

Kapitel 7

JSON und CSV

Ein Katalog, zwei Formen

Das Projekt neben diesem Kapitel beginnt mit catalog.csv. Am Ende wandelt catalog.py diese Datei in catalog.json um und kann das JSON wieder einlesen, ohne über die Bedeutung eines Werts raten zu müssen.

Lege den Vertrag fest, bevor du den Konverter schreibst. Ein Datenformat sagt, wie Text angeordnet ist. Ein Schema sagt, welche Anordnung dieses Projekt akzeptiert.

CSV ist eine Tabelle aus Text

Die erste Zeile benennt fünf Spalten:

sku,name,quantity,unit_price,in_stock

Jeder Datensatz bildet eine Tabellenzeile. Eine Zelle in Anführungszeichen kann einen Zeilenumbruch enthalten. Eine Tabellenzeile kann sich deshalb über mehrere physische Textzeilen erstrecken. Auch ein Komma innerhalb einer Zelle muss nach den CSV-Regeln in Anführungszeichen stehen, wie im Namen des zweiten Produkts:

GM-204,"Dice, Set of 6",0,7.25,false

CSV kennzeichnet 0 nicht als ganze Zahl und false nicht als booleschen Wert. Ein CSV-Leser liefert dem Programm Textzellen. Das Schema muss festlegen, welche Umwandlungen erlaubt sind. Für dieses Projekt gilt:

  • sku und name werden nach dem Entfernen umgebender Leerzeichen zu nicht leeren Strings;

  • quantity wird zu einer ganzen Zahl ab null;

  • unit_price wird zu einer endlichen Zahl ab null;

  • in_stock akzeptiert ausschließlich kleingeschriebenes true oder false und wird dann zu einem booleschen Wert.

Die genauen Regeln stehen in SCHEMA.md. Halte diese Datei offen, wenn eine spätere Übung fragt, ob ein Wert gültig ist. Beispiele sind nützlich; maßgeblich ist der schriftliche Vertrag.

JSON bewahrt die Struktur der Container und die Werttypen

Ein umgewandelter Artikel hat diese JSON-Form:

{
  "sku": "GM-204",
  "name": "Dice, Set of 6",
  "quantity": 0,
  "unit_price": 7.25,
  "in_stock": false
}

Die geschweiften Klammern bilden ein Objekt, ähnlich einem Python-Dictionary. Der Produktname ist ein String, 0 eine Zahl und false ein boolescher Wert. Diese Unterschiede gehören zu den Daten.

Die vollständige Ausgabe ist kein einzelner Artikel und kein alleinstehendes Array. Ihre oberste Ebene ist ein Objekt mit genau zwei Feldern:

{
  "schema_version": 1,
  "items": []
}

items enthält für jede CSV-Zeile ein Objekt in derselben Reihenfolge. Die Version neben den Artikeln festzuhalten gibt einem späteren Leser eine Stelle, an der er erkennen kann, welches Schema vorliegt.

Welchen Wert hat die Zelle quantity, nachdem csv.DictReader eine gültige Zeile gelesen hat, bevor dieses Projekt sie umwandelt?

Welcher Wert entspricht der festgelegten JSON-Struktur auf oberster Ebene?

Die nächste Lektion liest nur die CSV-Struktur: Kopfzeile, Datensätze und Zellenanzahl. Sie lässt jede Zelle absichtlich als Text stehen. Die Typumwandlung ist eine eigene Grenze und verdient eigene Prüfungen.