2.28. JSON

JSON (JavaScript Object Notation) ist ein kompaktes, menschenlesbares Textformat für strukturierte Daten. Es definiert sechs Typen – String, Number, Boolean, null, Array und Object – von denen jeder direkt auf einen Python-Wert abgebildet wird, sodass die Umwandlung zwischen Python und JSON in beide Richtungen ein einzelner Funktionsaufruf ist.

JSON ist die Lingua franca von Konfigurationsdateien und Web-APIs. Greifen Sie dazu, wann immer Sie ein kleines Bündel von Einstellungen in einer auch mit bloßem Auge lesbaren Form auf der Festplatte speichern oder strukturierte Daten mit einem anderen Programm austauschen müssen.

Zwei Funktionen decken die meisten Bedürfnisse ab:

  • json.dumps()dump string: einen Python-Wert in einen JSON-String umwandeln.

  • json.loads()load string: einen JSON-String wieder in Python parsen.

Das Paar json.dump / json.load (ohne s) erledigt dieselbe Aufgabe, nimmt aber direkt ein Dateiobjekt entgegen.

2.28.1. Kodierung (dumps)

import json

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

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

Ausgabe:

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

Die Abbildung lautet:

Alles außerhalb dieser Menge (eine benutzerdefinierte Klasse, ein bytes-Puffer, ein set) löst TypeError aus. Wandeln Sie den Wert zuerst um.

Bemerkung

CPythons json.dumps() akzeptiert ein indent-Argument für formatierte Ausgabe; das von MicroPython nicht. Der einzige Formatierungsregler ist separators, der den Abstand innerhalb der Zeile steuert – übergeben Sie (',', ':') für die kompakteste Form. Mehrzeilige, eingerückte Ausgabe muss bei Bedarf von Hand erzeugt werden.

2.28.2. Dekodierung (loads)

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

Ausgabe:

OpenMV 320

JSON-Objekte werden zu dict, Arrays werden zu list, und der Rest wird auf seine Python-Entsprechungen zurückabgebildet. Fehlerhaftes JSON löst ValueError aus.

2.28.3. Dateien lesen und schreiben

Das dateibasierte Paar harmoniert gut mit 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)

Behandeln Sie die JSON-Datei als vollständigen Datensatz – lesen Sie sie ein, ändern Sie den Python-Wert und schreiben Sie ihn zurück. Der Versuch, JSON direkt in einer Datei an Ort und Stelle zu bearbeiten, erzeugt meist mehr Fehler, als es einspart.