CSV naar JSON in Python — json.dumps() gids
Gebruik de gratis CSV to JSON direct in je browser — geen installatie nodig.
CSV to JSON online uitproberen →CSV-bestanden duiken overal op — geëxporteerde rapporten, database-dumps, logextracten — en vroeg of laat moet je dat CSV naar JSON converteren in Python. De standaardbibliotheek verwerkt dit met twee modules: csv.DictReader zet elke rij om naar een Python-dict, en json.dumps() serialiseert die dicts naar een JSON-string. Voor een snelle eenmalige conversie zonder code, doet de CSV naar JSON-converter dit direct in de browser. Deze gids behandelt het volledige programmatische pad: json.dump() vs json.dumps(), JSON naar bestanden schrijven, dataclass-serialisatie, type-omzetting voor CSV-waarden, omgaan met datetime en Decimal, en snelle alternatieven zoals orjson. Alle voorbeelden zijn gericht op Python 3.10+.
- ✓csv.DictReader levert een lijst van dicts — serialiseer de volledige lijst met json.dump(rows, f, indent=2) om een JSON-bestand te schrijven.
- ✓json.dump() schrijft direct naar een bestandsobject. json.dumps() geeft een string terug. Kies de juiste en vermijd een onnodige kopie.
- ✓CSV-waarden zijn altijd strings. Cast numerieke kolommen expliciet (int(), float()) voor serialisatie naar JSON.
- ✓Geef ensure_ascii=False mee aan json.dumps() om Unicode-tekens te bewaren — namen met accenten, CJK-tekst — in de uitvoer.
- ✓Gebruik voor datetime, UUID of Decimal vanuit CSV de default=-parameter met een aangepaste fallback-functie.
order_id,product,quantity,price ORD-7291,Wireless Keyboard,2,49.99 ORD-7292,USB-C Hub,1,34.50
[
{
"order_id": "ORD-7291",
"product": "Wireless Keyboard",
"quantity": "2",
"price": "49.99"
},
{
"order_id": "ORD-7292",
"product": "USB-C Hub",
"quantity": "1",
"price": "34.50"
}
]"2", "49.99") in de ruwe uitvoer. CSV heeft geen typesysteem — elke waarde is een string. Hoe je dit oplost wordt behandeld in de sectie over type-omzetting hieronder.json.dumps() — Een Python-dict serialiseren naar een JSON-string
De json module wordt meegeleverd met elke Python-installatie — geen pip install nodig. json.dumps(obj) neemt een Python-object (dict, list, string, getal, bool of None) en geeft een str terug met geldige JSON. Een Python-dictionary lijkt op een JSON-object, maar ze zijn fundamenteel anders: een dict is een Python-gegevensstructuur in het geheugen, en een JSON-string is geserialiseerde tekst. Aanroepen van json.dumps() overbrugt dat verschil.
Minimaal voorbeeld — Enkele CSV-rij naar JSON
import json
# Een enkele CSV-rij weergegeven als Python-dict
server_entry = {
"hostname": "web-prod-03",
"ip_address": "10.0.12.47",
"port": 8080,
"region": "eu-west-1"
}
# Converteer dict naar JSON-string
json_string = json.dumps(server_entry)
print(json_string)
# {"hostname": "web-prod-03", "ip_address": "10.0.12.47", "port": 8080, "region": "eu-west-1"}
print(type(json_string))
# <class 'str'>Dit levert compacte JSON op één regel op — goed voor payloads en opslag, slecht voor leesbaarheid. Voeg indent=2 toe voor leesbare uitvoer:
import json
server_entry = {
"hostname": "web-prod-03",
"ip_address": "10.0.12.47",
"port": 8080,
"region": "eu-west-1"
}
pretty_json = json.dumps(server_entry, indent=2)
print(pretty_json)
# {
# "hostname": "web-prod-03",
# "ip_address": "10.0.12.47",
# "port": 8080,
# "region": "eu-west-1"
# }Nog twee parameters die ik bij bijna elke aanroep gebruik: sort_keys=True sorteert dictionary-sleutels alfabetisch (handig voor het vergelijken van JSON-bestanden tussen versies), en ensure_ascii=False bewaart niet-ASCII-tekens in plaats van ze te escapen naar \uXXXX reeksen.
import json
warehouse_record = {
"sku": "WH-9031",
"location": "Amsterdam Depot 3",
"quantity": 240,
"last_audit": "2026-03-10"
}
output = json.dumps(warehouse_record, indent=2, sort_keys=True, ensure_ascii=False)
print(output)
# {
# "last_audit": "2026-03-10",
# "location": "Amsterdam Depot 3",
# "quantity": 240,
# "sku": "WH-9031"
# }Een korte noot over de separators parameter: de standaard is (", ", ": ") wat spaties toevoegt na komma's en dubbele punten. Voor de meest compacte uitvoer (handig bij het insluiten van JSON in URL-parameters of het minimaliseren van bytes in API-responses), geef dan separators=(",", ":") mee.
json.dumps() converteert Python True naar JSON true, None naar null, en plaatst strings tussen dubbele aanhalingstekens (Python staat enkele aanhalingstekens toe, JSON niet). Gebruik altijd json.dumps() voor geldige JSON — vertrouw niet op str() of repr().csv.DictReader naar JSON-bestand — De volledige pijplijn
De meest voorkomende taak in de praktijk is het lezen van een volledig CSV-bestand en het opslaan als JSON. Hier is het end-to-end script in minder dan 10 regels. csv.DictReader levert een iterator van dict objecten op — één per rij, met de eerste regel als sleutels. Omhullen met list() verzamelt alle rijen in een Python-lijst, die serialiseert naar een JSON-array.
import csv
import json
# Stap 1: Lees CSV-rijen in als lijst van dicts
with open("inventory.csv", "r", encoding="utf-8") as csv_file:
rows = list(csv.DictReader(csv_file))
# Stap 2: Schrijf de lijst als JSON-bestand
with open("inventory.json", "w", encoding="utf-8") as json_file:
json.dump(rows, json_file, indent=2, ensure_ascii=False)
print(f"Converted {len(rows)} rows to inventory.json")Twee open() aanroepen: één voor het lezen van de CSV, één voor het schrijven van de JSON. Dat is het volledige patroon. Let op dat hier json.dump() gebruikt wordt (zonder de s) — het schrijft direct naar het bestandsobject. Het gebruik van json.dumps() zou een string teruggeven die je daarna apart moet schrijven met f.write(). json.dump() is geheugenefficiënter omdat het de uitvoer streamt in plaats van eerst de volledige string in het geheugen op te bouwen.
Wanneer je de JSON als string nodig hebt in plaats van als bestand — voor insluiting in een API-payload, afdrukken naar stdout of invoegen in een databasekolom — schakel dan over naar json.dumps():
import csv
import json
with open("sensors.csv", "r", encoding="utf-8") as f:
rows = list(csv.DictReader(f))
# Geef de JSON als string terug in plaats van naar een bestand te schrijven
json_payload = json.dumps(rows, indent=2)
print(json_payload)
# [
# {
# "sensor_id": "TMP-4401",
# "location": "Gebouw 7 - Verdieping 2",
# "reading": "22.4",
# "unit": "celsius"
# },
# ...
# ]Enkele rij vs. volledige dataset: als je json.dumps(single_dict) aanroept, krijg je een JSON-object ({...}). Roep json.dumps(list_of_dicts) aan en je krijgt een JSON-array ([{...}, {...}]). De vorm van de buitenste container hangt af van wat je meegeeft. De meeste downstream afnemers verwachten een array voor tabelgegevens.
Omgaan met niet-string-waarden — Type-omzetting vanuit CSV
Dit is het punt dat iedereen de eerste keer verrast: csv.DictReader geeft elke waarde terug als een string. Het getal 42 in je CSV wordt de string "42" in de dict. Als je dat direct serialiseert met json.dumps(), bevat je JSON "quantity": "42" in plaats van "quantity": 42. API's die typen valideren zullen dit afwijzen. Je moet waarden expliciet omzetten.
import csv
import json
def coerce_types(row: dict) -> dict:
"""Converteer stringwaarden naar passende Python-typen."""
return {
"sensor_id": row["sensor_id"],
"location": row["location"],
"temperature": float(row["temperature"]),
"humidity": float(row["humidity"]),
"battery_pct": int(row["battery_pct"]),
"active": row["active"].lower() == "true",
}
with open("sensor_readings.csv", "r", encoding="utf-8") as f:
rows = [coerce_types(row) for row in csv.DictReader(f)]
print(json.dumps(rows[0], indent=2))
# {
# "sensor_id": "TMP-4401",
# "location": "Gebouw 7 - Verdieping 2",
# "temperature": 22.4,
# "humidity": 58.3,
# "battery_pct": 87,
# "active": true
# }Nu is temperature een float, battery_pct een integer, en active een boolean in de JSON-uitvoer. De omzetfunctie is specifiek voor je CSV-schema — er is geen generieke manier om typen te raden uit CSV-data, dus ik schrijf één functie per CSV-formaat.
Aangepaste objecten en niet-standaard typen serialiseren
Python's json module kan datetime, UUID, Decimal, of aangepaste klassen niet standaard serialiseren. Aanroepen van json.dumps() op een van deze geeft een TypeError. Twee benaderingen lossen dit op.
Benadering 1: De default=-parameter
Geef een functie mee aan default= die onbekende typen omzet naar iets serialiseerbaar. Deze functie wordt alleen aangeroepen voor objecten die de JSON-encoder niet kan verwerken.
import json
from datetime import datetime
from decimal import Decimal
from uuid import UUID
def json_serial(obj):
"""Fallback-serialiser voor niet-standaard typen."""
if isinstance(obj, datetime):
return obj.isoformat()
if isinstance(obj, UUID):
return str(obj)
if isinstance(obj, Decimal):
return float(obj)
raise TypeError(f"Type {type(obj).__name__} is niet JSON-serialiseerbaar")
transaction = {
"txn_id": UUID("a1b2c3d4-e5f6-7890-abcd-ef1234567890"),
"amount": Decimal("149.99"),
"currency": "EUR",
"processed_at": datetime(2026, 3, 15, 14, 30, 0),
"gateway": "stripe",
}
print(json.dumps(transaction, indent=2, default=json_serial))
# {
# "txn_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
# "amount": 149.99,
# "currency": "EUR",
# "processed_at": "2026-03-15T14:30:00",
# "gateway": "stripe"
# }TypeError aan het einde van je default= functie voor niet-herkende typen. Als je None teruggeeft of ze stilzwijgend overslaat, krijg je null in de uitvoer zonder enige aanwijzing dat er data verloren is gegaan.Benadering 2: Dataclasses met asdict()
Python-dataclasses geven je CSV-rijen een goede typedefinitie. Gebruik dataclasses.asdict() om een dataclass-instantie om te zetten naar een gewone dict en geef het daarna mee aan json.dumps().
import json
from dataclasses import dataclass, asdict
from datetime import datetime
@dataclass
class ShipmentRecord:
tracking_id: str
origin: str
destination: str
weight_kg: float
shipped_at: datetime
def json_serial(obj):
if isinstance(obj, datetime):
return obj.isoformat()
raise TypeError(f"Not serializable: {type(obj).__name__}")
shipment = ShipmentRecord(
tracking_id="SHP-9827",
origin="Amsterdam",
destination="Utrecht",
weight_kg=1240.5,
shipped_at=datetime(2026, 3, 12, 8, 0, 0),
)
print(json.dumps(asdict(shipment), indent=2, default=json_serial))
# {
# "tracking_id": "SHP-9827",
# "origin": "Amsterdam",
# "destination": "Utrecht",
# "weight_kg": 1240.5,
# "shipped_at": "2026-03-12T08:00:00"
# }asdict() converteert geneste dataclasses recursief naar dicts. Als je dataclass een lijst van andere dataclasses bevat, wordt de hele boom geconverteerd — geen extra code nodig.json.dumps() Parameters Referentie
Volledige lijst van sleutelwoordargumenten die worden geaccepteerd door json.dumps() en json.dump(). Beide functies accepteren identieke parameters — json.dump() neemt een extra eerste argument voor het bestandsobject.
csv.DictReader — CSV inlezen als Python-dicts
csv.DictReader is de andere helft van de CSV-naar-JSON-pijplijn. Het omhult een bestandsobject en levert één dict per rij op, met de eerste regel als veldnamen. Vergeleken met csv.reader (dat gewone lijsten oplevert) geeft DictReader je benoemde toegang tot kolommen — geen magische indexen zoals row[3].
import csv
import json
# Tab-gescheiden bestand van een database-export
with open("user_sessions.tsv", "r", encoding="utf-8") as f:
reader = csv.DictReader(f, delimiter="\t")
sessions = list(reader)
print(json.dumps(sessions[:2], indent=2))
# [
# {
# "session_id": "sess_8f2a91bc",
# "user_id": "usr_4421",
# "started_at": "2026-03-15T09:12:00Z",
# "duration_sec": "342",
# "pages_viewed": "7"
# },
# {
# "session_id": "sess_3c7d44ef",
# "user_id": "usr_1187",
# "started_at": "2026-03-15T09:14:22Z",
# "duration_sec": "128",
# "pages_viewed": "3"
# }
# ]csv.DictReader leest het volledige bestand lui — het levert rijen één voor één op. Aanroepen van list(reader) laadt alle rijen in het geheugen. Voor bestanden met miljoenen rijen verwerk je rijen beter op een streaming manier in plaats van ze allemaal te verzamelen.CSV converteren vanuit een bestand en API-response
Twee productiescenario's: een CSV-bestand van schijf lezen en converteren, en CSV-data ophalen van een API-endpoint (veel rapportageservices retourneren CSV). Beide vereisen goede foutafhandeling.
CSV-bestand lezen → converteren → JSON schrijven
import csv
import json
import sys
def csv_to_json_file(csv_path: str, json_path: str) -> int:
"""Converteer een CSV-bestand naar JSON. Geeft het aantal geschreven rijen terug."""
try:
with open(csv_path, "r", encoding="utf-8") as f:
rows = list(csv.DictReader(f))
except FileNotFoundError:
print(f"Error: {csv_path} not found", file=sys.stderr)
sys.exit(1)
except csv.Error as e:
print(f"CSV parse error in {csv_path}: {e}", file=sys.stderr)
sys.exit(1)
with open(json_path, "w", encoding="utf-8") as f:
json.dump(rows, f, indent=2, ensure_ascii=False)
return len(rows)
count = csv_to_json_file("fleet_vehicles.csv", "fleet_vehicles.json")
print(f"Wrote {count} records to fleet_vehicles.json")CSV ophalen van API → verwerken → JSON
import csv
import io
import json
import urllib.request
def fetch_csv_as_json(url: str) -> str:
"""Haal CSV op van een URL en geef het terug als JSON-string."""
try:
with urllib.request.urlopen(url, timeout=10) as resp:
raw = resp.read().decode("utf-8")
except urllib.error.URLError as e:
raise RuntimeError(f"Failed to fetch {url}: {e}")
reader = csv.DictReader(io.StringIO(raw))
rows = list(reader)
if not rows:
raise ValueError("CSV response was empty or had no data rows")
return json.dumps(rows, indent=2, ensure_ascii=False)
# Voorbeeld: export-endpoint dat CSV retourneert
try:
result = fetch_csv_as_json("https://reports.internal/api/v2/daily-metrics.csv")
print(result)
except (RuntimeError, ValueError) as e:
print(f"Error: {e}")Beide voorbeelden gebruiken expliciet encoding="utf-8" bij elke bestandsopening. Dit is van belang bij CSV-bestanden met niet-ASCII-tekens — namen met accenten, adressen met speciale tekens, CJK-tekst. Zonder expliciete codering valt Python terug op de systeemstandaard, die op Windows vaak cp1252 is en stilzwijgend multibyte-tekens beschadigt.
JSON-uitvoer verifiëren met json.loads()
Na het converteren van CSV naar een JSON-string kun je het resultaat verifiëren door het terug te verwerken met json.loads(). Deze round-trip vangt coderingsproblemen, gebroken escape-reeksen of onbedoelde stringconcatenatie op die ongeldige JSON zou produceren. Omhul de aanroep in een try/except-blok.
import json
json_string = json.dumps({"order_id": "ORD-7291", "total": 129.99})
# Verifieer dat het geldige JSON is door het terug te verwerken
try:
parsed = json.loads(json_string)
print(f"Valid JSON with {len(parsed)} keys")
except json.JSONDecodeError as e:
print(f"Invalid JSON: {e}")
# Valid JSON with 2 keysCSV naar JSON converteren via de commandoregel
Snelle conversies vanuit de terminal — geen scriptbestand nodig. Python's -c vlag voert inline code uit, en je kunt het resultaat doorsluizen naar python3 -m json.tool voor opmaak.
python3 -c " import csv, json, sys rows = list(csv.DictReader(sys.stdin)) json.dump(rows, sys.stdout, indent=2) " < inventory.csv > inventory.json
python3 -c "import csv,json,sys; print(json.dumps(list(csv.DictReader(sys.stdin))))" < data.csv | python3 -m json.tool
python3 -c "import csv,json,sys; json.dump(list(csv.DictReader(sys.stdin)),sys.stdout)" < report.csv | jq .
python3 -m json.tool is de ingebouwde JSON-formatter. Het leest JSON van stdin, valideert het en drukt het af met 4-spaties inspringing. Handig voor het verifiëren dat je CSV-naar-JSON-conversie geldige uitvoer heeft geproduceerd. Als je de voorkeur geeft aan 2-spaties inspringing of filtering nodig hebt, gebruik dan jq.Snelle alternatief — orjson
De ingebouwde json module werkt prima voor de meeste CSV-bestanden. Maar als je datasets met tienduizenden rijen in een lus verwerkt, of je API CSV-afgeleide data bij elk verzoek moet serialiseren, orjson is 5–10x sneller. Het is geschreven in Rust, geeft bytes terug in plaats van str, en serialiseert datetime, UUID, en numpy arrays native zonder een aangepaste default= functie.
pip install orjson
import csv
import orjson
with open("telemetry_events.csv", "r", encoding="utf-8") as f:
rows = list(csv.DictReader(f))
# orjson.dumps() geeft bytes terug, geen str
json_bytes = orjson.dumps(rows, option=orjson.OPT_INDENT_2)
with open("telemetry_events.json", "wb") as f: # let op: "wb" voor bytes
f.write(json_bytes)
print(f"Wrote {len(rows)} events ({len(json_bytes)} bytes)")De API verschilt enigszins: orjson.dumps() geeft bytes terug en gebruikt option= vlaggen in plaats van sleutelwoordargumenten. Open bestanden in binaire schrijfmodus ("wb") bij het schrijven van orjson-uitvoer. Als je een string nodig hebt, roep dan .decode("utf-8") aan op het resultaat.
Terminaluitvoer met syntaxisaccentuering — rich
Debuggen van CSV-naar-JSON-conversies in de terminal wordt eenvoudiger met gekleurde uitvoer. De rich bibliotheek toont JSON met syntaxisaccentuering — sleutels, strings, getallen en booleans krijgen elk hun eigen kleur.
pip install rich
import csv
import json
from rich.console import Console
from rich.syntax import Syntax
console = Console()
with open("deployment_log.csv", "r", encoding="utf-8") as f:
rows = list(csv.DictReader(f))
json_output = json.dumps(rows[:3], indent=2, ensure_ascii=False)
syntax = Syntax(json_output, "json", theme="monokai", line_numbers=True)
console.print(syntax)rich voegt ANSI-escapecodes toe aan de uitvoer. Schrijf geen rich-geformatteerde uitvoer naar een bestand of een API-response — het zal onzichtbare controletekens bevatten. Gebruik rich alleen voor weergave in de terminal.Werken met grote CSV-bestanden
Een CSV-bestand van 500 MB laden met list(csv.DictReader(f)) wijst de volledige dataset toe in het geheugen, waarna json.dump() de volledige JSON-string bovenop dat opbouwt. Voor bestanden groter dan 50–100 MB, schakel over naar een streaming-aanpak of schrijf NDJSON (newline-delimited JSON) — één JSON-object per regel.
NDJSON — Één JSON-object per regel
import csv
import json
def csv_to_ndjson(csv_path: str, ndjson_path: str) -> int:
"""Converteer CSV naar NDJSON, één rij tegelijk verwerken."""
count = 0
with open(csv_path, "r", encoding="utf-8") as infile, \
open(ndjson_path, "w", encoding="utf-8") as outfile:
for row in csv.DictReader(infile):
outfile.write(json.dumps(row, ensure_ascii=False) + "\n")
count += 1
return count
rows_written = csv_to_ndjson("access_log.csv", "access_log.ndjson")
print(f"Wrote {rows_written} lines to access_log.ndjson")
# Elke regel is een zelfstandig JSON-object:
# {"timestamp":"2026-03-15T09:12:00Z","method":"GET","path":"/api/v2/orders","status":"200"}
# {"timestamp":"2026-03-15T09:12:01Z","method":"POST","path":"/api/v2/payments","status":"201"}Streaming met ijson voor grote JSON-invoer
import ijson # pip install ijson
def count_high_value_orders(json_path: str, threshold: float) -> int:
"""Tel bestellingen boven een drempelwaarde zonder het volledige bestand te laden."""
count = 0
with open(json_path, "rb") as f:
for item in ijson.items(f, "item"):
if float(item.get("total", 0)) > threshold:
count += 1
return count
# Verwerk een JSON-bestand van 2 GB met constant geheugengebruik
high_value = count_high_value_orders("all_orders.json", 500.0)
print(f"Found {high_value} orders above $500")ijson is voor het terugleggen van grote JSON-bestanden — voor het schrijfgedeelte houdt het NDJSON-patroon hierboven het geheugengebruik constant, ongeacht de bestandsgrootte.Veelgemaakte fouten
Probleem: json.dumps() geeft een string terug. Dit schrijven met f.write() werkt, maar creëert een onnodige tussenliggende string in het geheugen — verspilling bij grote datasets.
Oplossing: Gebruik json.dump(data, f) om direct naar het bestandsobject te schrijven. Het streamt de uitvoer zonder eerst de volledige string op te bouwen.
json_string = json.dumps(rows, indent=2)
with open("output.json", "w") as f:
f.write(json_string) # onnodige tussenliggende stringwith open("output.json", "w", encoding="utf-8") as f:
json.dump(rows, f, indent=2, ensure_ascii=False) # direct schrijvenProbleem: csv.DictReader geeft alle waarden als strings terug. JSON-uitvoer bevat "quantity": "5" in plaats van "quantity": 5, wat getypeerde API-afnemers breekt.
Oplossing: Zet numerieke kolommen expliciet om met int() of float() vóór het serialiseren.
rows = list(csv.DictReader(f))
json.dumps(rows)
# [{"port": "8080", "workers": "4"}] ← strings, geen getallenrows = list(csv.DictReader(f))
for row in rows:
row["port"] = int(row["port"])
row["workers"] = int(row["workers"])
json.dumps(rows)
# [{"port": 8080, "workers": 4}] ← correcte integersProbleem: Op Windows is de standaardcodering cp1252. Niet-ASCII-tekens (namen met accenten, CJK-tekst) worden stilzwijgend beschadigd of geven een UnicodeDecodeError.
Oplossing: Geef altijd encoding='utf-8' mee aan open() voor zowel het lezen van CSV als het schrijven van JSON.
with open("locations.csv", "r") as f: # gebruikt systeemstandaard codering
rows = list(csv.DictReader(f))with open("locations.csv", "r", encoding="utf-8") as f:
rows = list(csv.DictReader(f))Probleem: str(mijn_dict) produceert Python-syntax (enkele aanhalingstekens, True, None) wat geen geldige JSON is. API's en JSON-parsers wijzen dit af.
Oplossing: Gebruik altijd json.dumps() voor geldige JSON. Het converteert True naar true, None naar null en gebruikt dubbele aanhalingstekens.
output = str({"active": True, "note": None})
# "{'active': True, 'note': None}" ← GEEN geldige JSONoutput = json.dumps({"active": True, "note": None})
# '{"active": true, "note": null}' ← geldige JSONjson.dumps() vs alternatieven — Snelle vergelijking
Voor de meeste CSV-naar-JSON-conversies is de standaardbibliotheek csv + json combinatie de juiste keuze: geen afhankelijkheden, meegeleverd met Python, werkt overal. Grijp naar orjson wanneer profilering aantoont dat serialisatie een knelpunt is — het snelheidsverschil is reëel op schaal. Gebruik pandas wanneer je ook data-opschoning, filtering of aggregatie nodig hebt vóór de conversie naar JSON. Als je gewoon een snelle conversie zonder code nodig hebt, handelt de online CSV naar JSON-converter dit direct af.
Veelgestelde vragen
Wat is het verschil tussen json.dump() en json.dumps() in Python?
json.dump(obj, file) schrijft de JSON-uitvoer rechtstreeks naar een bestandsachtig object (alles met een .write()-methode). json.dumps(obj) geeft een JSON-geformatteerde string terug. Gebruik json.dump() bij het schrijven naar een bestand, json.dumps() wanneer je de JSON als Python-string nodig hebt voor logging, insluiting in een payload of verzending via een socket. Beide accepteren dezelfde sleutelwoordargumenten (indent, sort_keys, ensure_ascii, default).
Hoe converteer ik een Python-dictionary naar een JSON-string?
Roep json.dumps(jouw_dict) aan. De retourwaarde is een str met geldige JSON. Voeg indent=2 toe voor leesbare uitvoer. Als je dict niet-ASCII-waarden bevat, geef dan ensure_ascii=False mee om tekens zoals letters met accenten of CJK-tekst te bewaren.
import json
server_config = {"host": "api.internal", "port": 8443, "debug": False}
json_string = json.dumps(server_config, indent=2)
print(json_string)
# {
# "host": "api.internal",
# "port": 8443,
# "debug": false
# }Hoe sla ik een Python-lijst van dicts op als JSON-bestand?
Open een bestand in schrijfmodus met UTF-8-codering en roep dan json.dump(jouw_lijst, f, indent=2, ensure_ascii=False) aan. Gebruik altijd json.dump() (niet json.dumps()) voor bestandsuitvoer — het schrijft direct naar het bestandsobject zonder een tussenliggende string in het geheugen aan te maken.
import json
records = [
{"order_id": "ORD-4821", "total": 129.99, "currency": "USD"},
{"order_id": "ORD-4822", "total": 89.50, "currency": "EUR"},
]
with open("orders.json", "w", encoding="utf-8") as f:
json.dump(records, f, indent=2, ensure_ascii=False)Waarom verandert json.dumps() True in true en None in null?
Python-booleans (True, False) en None zijn geen geldige JSON-tokens. De JSON-specificatie gebruikt lowercase true, false en null. json.dumps() verwerkt deze omzetting automatisch — True wordt true, False wordt false, None wordt null. Je hoeft dit niet handmatig te converteren. In de omgekeerde richting zet json.loads() ze terug naar Python-typen.
Hoe ga ik om met datetime-objecten bij het converteren van CSV-data naar JSON?
Geef een default=-functie mee aan json.dumps() die datetime-objecten omzet naar ISO 8601-strings. De default-functie wordt aangeroepen voor elk object dat json niet native kan serialiseren. Geef obj.isoformat() terug voor datetime-instanties en gooi TypeError voor al het andere.
import json
from datetime import datetime
def json_default(obj):
if isinstance(obj, datetime):
return obj.isoformat()
raise TypeError(f"Niet serialiseerbaar: {type(obj)}")
event = {"action": "login", "timestamp": datetime(2026, 3, 15, 9, 30, 0)}
print(json.dumps(event, default=json_default))
# {"action": "login", "timestamp": "2026-03-15T09:30:00"}Kan ik CSV naar JSON converteren zonder pandas?
Ja. De Python-standaardbibliotheek heeft alles wat je nodig hebt. Gebruik csv.DictReader om elke rij als een dictionary in te lezen, verzamel de rijen in een lijst en serialiseer met json.dump() of json.dumps(). Geen externe bibliotheken vereist. Pandas is alleen de moeite waard als je ook data-opschoning, type-inferentie nodig hebt of het al elders in het project gebruikt.
import csv
import json
with open("inventory.csv", "r", encoding="utf-8") as csv_file:
rows = list(csv.DictReader(csv_file))
with open("inventory.json", "w", encoding="utf-8") as json_file:
json.dump(rows, json_file, indent=2, ensure_ascii=False)Voor een alternatief met één klik zonder Python te schrijven, probeer de CSV naar JSON-converter — plak je CSV-data en ontvang direct geformatteerde JSON-uitvoer.
Gerelateerde tools
Maria is a backend developer specialising in Python and API integration. She has broad experience with data pipelines, serialisation formats, and building reliable server-side services. She is an active member of the Python community and enjoys writing practical, example-driven guides that help developers solve real problems without unnecessary theory.
Priya is a data scientist and machine learning engineer who has worked across the full Python data stack — from raw data ingestion and cleaning to model deployment and monitoring. She is passionate about reproducible research, Jupyter-based workflows, and the practical engineering side of ML. She writes about NumPy, Pandas, data serialisation, and the Python patterns that make data pipelines reliable at scale.