2.28. JSON

JSON (JavaScript Object Notation) is een compact, voor mensen leesbaar tekstformaat voor gestructureerde data. Het definieert zes types – string, number, boolean, null, array en object – die elk rechtstreeks op een Python-waarde worden afgebeeld, dus het converteren tussen Python en JSON is in beide richtingen een enkele functieaanroep.

JSON is de lingua franca van configuratiebestanden en web-API’s. Gebruik het wanneer je een kleine bundel instellingen naar schijf moet opslaan in een vorm die je ook met het oog kunt lezen, of om gestructureerde data uit te wisselen met een ander programma.

Twee functies dekken de meeste behoeften:

  • json.dumps()dump string: zet een Python-waarde om in een JSON-string.

  • json.loads()load string: ontleed een JSON-string terug naar Python.

Het paar json.dump / json.load (zonder s) doet hetzelfde werk maar neemt rechtstreeks een bestandsobject.

2.28.1. Coderen (dumps)

import json

config = {
    "name":  "OpenMV",
    "width": 320,
    "tags":  ["red", "round"],
}

text = json.dumps(config)
print(text)

Uitvoer:

{"name": "OpenMV", "width": 320, "tags": ["red", "round"]}

De afbeelding is:

Alles buiten die set (een aangepaste klasse, een bytes-buffer, een set) werpt TypeError op. Converteer de waarde eerst.

Notitie

CPythons json.dumps() accepteert een indent-argument voor mooi-geformatteerde uitvoer; die van MicroPython niet. De enige opmaakknop is separators, die de inline-spatiëring bestuurt – geef (',', ':') mee voor de meest compacte vorm. Meerregelige, ingesprongen uitvoer moet zo nodig met de hand worden geproduceerd.

2.28.2. Decoderen (loads)

text = '{"name": "OpenMV", "width": 320}'
config = json.loads(text)
print(config["name"], config["width"])

Uitvoer:

OpenMV 320

JSON-objecten worden dict, arrays worden list, en de rest wordt teruggemapt naar hun Python-equivalenten. Slechte JSON werpt ValueError op.

2.28.3. Bestanden lezen en schrijven

Het bestandsgebaseerde paar werkt goed samen met with:

import json

with open("config.json") as f:
    config = json.load(f)

config["width"] = 640

with open("config.json", "w") as f:
    json.dump(config, f)

Behandel het JSON-bestand als een volledig record – lees het in, wijzig de Python-waarde, schrijf het terug. JSON ter plekke in een bestand bewerken creëert meestal meer bugs dan het bespaart.