Python JSON: Encoding, Decoding en Bestandsafhandeling – Een Praktische Gids
Wat is JSON in Python?
JSON—kort voor JavaScript Object Notation—is het meest gebruikte tekst-gebaseerde data-uitwisselingsformaat. In Python wijst het direct op native datastructuren: objects worden dicts, arrays worden lists, strings, nummers, booleans en null vertalen naar str, int/float, bool en None respectievelijk. De json module in de standaardbibliotheek behandelt alle conversies.
JSON Bibliotheek in Python
Importeer de module één keer in je script:
import json
De module biedt vier kernmethodes:
| Methode | Beschrijving |
|---|---|
| dumps() | Converteer een Python-object naar een JSON-string. |
| dump() | Schrijf een JSON-string direct naar een bestandsobject. |
| loads() | Parse een JSON-string naar een Python-object. |
| load() | Lees en parse een JSON-bestand naar een Python-object. |
Python naar JSON (Encoding)
Encoding is het proces van het converteren van Python-datatypen naar JSON. De standaard mapping wordt hieronder getoond:
| Python | JSON |
|---|---|
| dict | Object |
| list | Array |
| str/unicode | String |
| int/long | Number (int) |
| float | Number (real) |
| True | true |
| False | false |
| None | null |
Voorbeeld met json.dumps():
import json
x = {
"name": "Ken",
"age": 45,
"married": True,
"children": ("Alice", "Bob"),
"pets": ["Dog"],
"cars": [
{"model": "Audi A1", "mpg": 15.1},
{"model": "Zeep Compass", "mpg": 18.1}
]
}
# Pretty-print met gesorteerde sleutels
sorted_string = json.dumps(x, indent=4, sort_keys=True)
print(sorted_string)
Output:
{
"age": 45,
"cars": [
{
"model": "Audi A1",
"mpg": 15.1
},
{
"model": "Zeep Compass",
"mpg": 18.1
}
],
"children": [
"Alice",
"Bob"
],
"married": true,
"name": "Ken",
"pets": [
"Dog"
]
}
Een JSON-object naar een bestand schrijven is eenvoudig met json.dump():
with open('json_bestand.json', 'w') as file_write:
json.dump(x, file_write, indent=4, sort_keys=True)
Na het draaien van het script bevat json_bestand.json de geserialiseerde data.
JSON naar Python (Decoding)
Decoding keert de mapping om, een JSON-string of bestand terugveranderend in native Python-objecten. De conversietabel spiegelt de encoding-tabel:
| JSON | Python |
|---|---|
| Object | dict |
| Array | list |
| String | str |
| Number (int) | int |
| Number (real) | float |
| true | True |
| false | False |
| null | None |
Voorbeeld met json.loads():
import json
person_data = '{"person": {"name": "Kenn", "sex": "male", "age": 28}}'
obj = json.loads(person_data)
print(obj)
print(type(obj))
print(obj.get('person'))
Output:
{'person': {'name': 'Kenn', 'sex': 'male', 'age': 28}}
<class 'dict'>
{'name': 'Kenn', 'sex': 'male', 'age': 28}
Een JSON-bestand direct lezen:
with open('json_bestand.json') as f:
data = json.load(f)
print(data)
Output:
{'name': 'Ken', 'age': 45, ...}
Compacte en Pretty-Print Encoding
Voor netwerktransmissie verwijdert compacte encoding witruimte:
lst = ['a', 'b', 'c', {"4": 5, "6": 7}]
compact = json.dumps(lst, separators=(',', ':'))
print(compact)
Output:
["a","b","c",{"4":5,"6":7}]
Voor menselijke leesbaarheid gebruikt pretty-printing inspringing:
dic = {"a": 4, "b": 5}
pretty = json.dumps(dic, indent=4, separators=(',', ': '))
print(pretty)
Output:
{
"a": 4,
"b": 5
}
Complexe Objecten Encoderen
De json module kan willekeurige objecten niet serialiseren. Om een complex getal te hanteren, lever je een default functie:
def complex_encode(o):
if isinstance(o, complex):
return [o.real, o.imag]
raise TypeError(f"{repr(o)} is not JSON serializable")
print(json.dumps(4 + 5j, default=complex_encode))
Output:
[4.0, 5.0]
Complexe Objecten Decoderen
Gebruik object_hook om een custom marker te detecteren en het complexe getal te herbouwen:
def is_complex(obj):
if "__complex__" in obj:
return complex(obj["real"], obj["img"])
return obj
complex_obj = json.loads('{"__complex__": true, "real": 4, "img": 5}', object_hook=is_complex)
print(complex_obj)
Output:
(4+5j)
Serialisatie & Deserialisatie Klassen
De JSONEncoder en JSONDecoder klassen bieden fijnmazige controle:
JSONEncoder.default(o)– overschrijf om custom objecten te serialiseren.JSONEncoder.encode(o)– retourneer een JSON-string.JSONEncoder.iterencode(o)– itereer over de output-string.JSONDecoder.decode(s)– parse een JSON-string.JSONDecoder.raw_decode(s)– parse beginnend bij een gegeven index.
Voorbeeld:
from json.encoder import JSONEncoder
print(JSONEncoder().encode({"kleur": ["rood", "geel", "groen"]}))
JSON Ophalen van een URL
Met requests een live JSON-feed downloaden (bijv. CityBike NYC):
import json, requests
response = requests.get("https://feeds.citibikenyc.com/stations/stations.json")
bike_dict = json.loads(response.text)
print(bike_dict['stationBeanList'][0])
Output:
{ 'id': 487, 'stationName': 'E 20 St & FDR Drive', 'availableDocks': 24, ... }
JSON Exceptions Afhandelen
De primaire exception is json.JSONDecodeError, een subklasse van ValueError. Voorbeeld afhandeling:
try:
with open('slecht.json') as f:
data = json.load(f)
except json.JSONDecodeError as e:
print(f"Slecht JSON: {e}")
Speciale Numerieke Waarden
RFC 8259 staat Infinity of NaN niet toe, maar de Python encoder vertegenwoordigt ze als strings:
print(json.dumps(float('inf')))
print(json.dumps(float('nan')))
Output:
Infinity NaN
Herhaalde Sleutels in JSON
Wanneer een sleutel meerdere keren voorkomt, houdt Python's json.loads() alleen de laatste occurentie:
json.loads('{"a": 1, "a": 2, "a": 3}') # -> {'a': 3}
Command-Line Tools
De json.tool module formatteert en valideert JSON vanaf de command line:
$ echo '{"name": "Koning Arthur"}' | python3 -m json.tool
{
"name": "Koning Arthur"
}
Voordelen van JSON in Python
- Native ondersteuning via de
jsonmodule. - Menselijk leesbaar met pretty-printing.
- Breed geadopteerd voor API's, configuratie en data-opslag.
- Taal-onafhankelijk en lichtgewicht.
Beperkingen
- Ondersteunt geen custom datatypen zonder custom encoder.
- Maximale recursiediepte beperkt diep geneste structuren.
- Grote documenten kunnen geheugen-intensief zijn om volledig te laden.
Python JSON Cheat Sheet
| Functie | Beschrijving |
|---|---|
| json.dumps(obj) | Serialiseer Python-object naar JSON-string. |
| json.dump(obj, file) | Schrijf JSON-string naar een bestand. |
| json.dumps(obj, separators=(",", ":")) | Compacte representatie zonder spaties. |
| json.dumps(obj, indent=4) | Pretty-printed JSON met inspringing. |
| json.dumps(obj, sort_keys=True) | Sorteer dictionary-sleutels alfabetisch. |
| json.dumps(obj, default=custom) | Encodeer niet-ondersteunde objecten. |
| JSONEncoder().encode(obj) | Handmatige serialisatie via encoder klasse. |
| json.loads(s) | Parse JSON-string naar Python-object. |
| json.loads(s, object_hook=custom) | Custom deserialisatie logica. |
| JSONDecoder().decode(s) | Handmatige deserialisatie via decoder klasse. |
Python
- Python Datatypes onder de knie krijgen: Een praktische gids
- Python Operators onder de knie krijgen: Een uitgebreide gids
- Python's While Loop onder de knie krijgen: Syntaxis, Voorbeelden en Best Practices
- Python Pass Statement onder de knie krijgen: Een praktische gids
- Python Functies onder de knie krijgen: Syntaxis, Types en Praktische Voorbeelden
- Python Functie-argumenten onder de knie krijgen: Positionele, Keyword en Default Parameters
- Python-dictionaries beheersen: aanmaken, manipuleren en geavanceerde technieken
- Python-bestands-I/O: bestandsbewerkingen, lezen, schrijven en beheer beheersen
- Bestands- en directory-bestaat controleren in Python – Een praktische gids
- Python Bestands I/O: In- en uitvoerbewerkingen onder de knie krijgen
- Bestanden Lezen in Java met BufferedReader – Een Praktische Gids met Voorbeelden