2.28. JSON

JSON (JavaScript Object Notation) är ett kompakt, läsbart textformat för strukturerad data. Det definierar sex typer – sträng, tal, boolesk, null, array och objekt – som var och en mappas direkt mot ett Python-värde, så att konvertera mellan Python och JSON är ett enda funktionsanrop i endera riktningen.

JSON är lingua franca för konfigurationsfiler och webb-API:er. Använd det när du behöver spara ett litet paket med inställningar till disk i en form du också kan läsa med ögat, eller utbyta strukturerad data med ett annat program.

Två funktioner täcker de flesta behov:

  • json.dumps()dump string: gör om ett Python-värde till en JSON-sträng.

  • json.loads()load string: tolkar en JSON-sträng tillbaka till Python.

Paret json.dump / json.load (utan s) gör samma jobb men tar ett filobjekt direkt.

2.28.1. Kodning (dumps)

import json

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

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

Utdata:

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

Mappningen är:

Allt utanför den uppsättningen (en anpassad klass, en bytes-buffert, en set) kastar TypeError. Konvertera värdet först.

Anteckning

CPythons json.dumps() accepterar ett indent-argument för snyggt formaterad utdata; MicroPythons gör det inte. Den enda formateringsratten är separators, som styr mellanrummen på raden – skicka (',', ':') för den mest kompakta formen. Flerradig, indenterad utdata måste produceras för hand om det behövs.

2.28.2. Avkodning (loads)

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

Utdata:

OpenMV 320

JSON-objekt blir dict, arrayer blir list, och resten mappas tillbaka till sina Python-motsvarigheter. Felaktig JSON kastar ValueError.

2.28.3. Läsa och skriva filer

Det filbaserade paret fungerar fint med 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)

Behandla JSON-filen som en komplett post – läs in den, modifiera Python-värdet, skriv tillbaka det. Att försöka redigera JSON på plats inuti en fil skapar oftast fler buggar än det sparar.