0%

Hoofdstuk 7

JSON en CSV

Eén catalogus, twee vormen

Het project bij dit hoofdstuk begint met catalog.csv. Aan het einde maakt catalog.py daar catalog.json van en kan het die JSON teruglezen zonder te raden wat een waarde betekent.

Leg het contract vast voordat je de converter schrijft. Een gegevensformaat vertelt hoe tekst is opgebouwd. Een schema zegt welke opbouw dit project accepteert.

CSV is een tabel van tekst

De eerste regel benoemt vijf kolommen:

sku,name,quantity,unit_price,in_stock

Elk gegevensrecord is één rij. Een cel tussen aanhalingstekens kan een newline bevatten, dus een rij kan meerdere fysieke regels beslaan. Een komma in een cel vereist ook CSV-aanhalingstekens, zoals in de naam van het tweede product:

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

CSV markeert 0 niet als integer of false als boolean. Een CSV-lezer geeft het programma tekstcellen. Het schema moet bepalen welke omzettingen zijn toegestaan. Voor dit project:

  • worden sku en name niet-lege strings nadat spaties eromheen zijn verwijderd;

  • wordt quantity een integer van nul of meer;

  • wordt unit_price een eindig getal van nul of meer;

  • accepteert in_stock alleen true of false in kleine letters en wordt daarna een boolean.

De precieze regels staan in SCHEMA.md. Houd dat bestand open als een latere oefening vraagt of een waarde geldig is. Voorbeelden zijn nuttig; het geschreven contract is leidend.

JSON bewaart de vorm van containers en het type van waarden

Eén omgezet item heeft deze JSON-vorm:

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

De accolades maken een object, vergelijkbaar met een Python-dictionary. De productnaam is een string, 0 is een getal en false is een boolean. Die verschillen horen bij de gegevens.

De volledige uitvoer is geen los item of een losse array. Op het hoogste niveau staat een object met precies twee velden:

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

items bevat straks één object per CSV-rij, in dezelfde volgorde. Door de versie naast de items te bewaren kan een toekomstige lezer bepalen welk schema er wordt gebruikt.

Welke waarde heeft de cel quantity nadat csv.DictReader een geldige rij heeft gelezen, voordat dit project die omzet?

Welke waarde past bij de afgesproken JSON-vorm op het hoogste niveau?

De volgende les leest alleen de CSV-structuur: kop, rijen en aantal cellen. Elke cel blijft bewust tekst. Typeconversie is een aparte overgang en verdient eigen controles.