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
skuennameniet-lege strings nadat spaties eromheen zijn verwijderd;wordt
quantityeen integer van nul of meer;wordt
unit_priceeen eindig getal van nul of meer;accepteert
in_stockalleentrueoffalsein 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.