2.28. JSON

A JSON (JavaScript Object Notation) egy tömör, ember által olvasható szöveges formátum strukturált adatokhoz. Hat típust definiál – string, number, boolean, null, array és object –, amelyek mindegyike közvetlenül egy Python értékre képeződik le, így a Python és a JSON közötti átalakítás mindkét irányban egyetlen függvényhívás.

A JSON a konfigurációs fájlok és a webes API-k közös nyelve. Nyúlj hozzá, valahányszor egy kis csomag beállítást kell lemezre mentened olyan formában, amelyet szemmel is el tudsz olvasni, vagy strukturált adatot kell kicserélned egy másik programmal.

Két függvény fedi le a legtöbb igényt:

  • json.dumps()dump string: egy Python érték JSON sztringgé alakítása.

  • json.loads()load string: egy JSON sztring visszaalakítása Python objektummá.

A json.dump / json.load pár (s nélkül) ugyanezt a feladatot végzi, de közvetlenül egy fájlobjektumot vesz át.

2.28.1. Kódolás (dumps)

import json

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

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

Kimenet:

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

A leképezés a következő:

Bármi, ami ezen a halmazon kívül esik (egy egyedi osztály, egy bytes puffer, egy set), TypeError kivételt vált ki. Először alakítsd át az értéket.

Megjegyzés

A CPython json.dumps() függvénye elfogad egy indent argumentumot a szépen formázott kimenethez; a MicroPython-é nem. Az egyetlen formázási szabályozó a separators, amely a soron belüli térközöket vezérli – add át a (',', ':') értéket a legtömörebb formához. A többsoros, behúzott kimenetet kézzel kell előállítani, ha szükséges.

2.28.2. Dekódolás (loads)

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

Kimenet:

OpenMV 320

A JSON object-ekből dict lesz, a tömbökből list, a többi pedig visszaképeződik a Python megfelelőjére. A hibás JSON ValueError kivételt vált ki.

2.28.3. Fájlok olvasása és írása

A fájlalapú pár jól együttműködik a with utasítással:

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)

Kezeld a JSON fájlt teljes rekordként – olvasd be, módosítsd a Python értéket, írd vissza. A JSON helyben, a fájlon belüli szerkesztésének megkísérlése általában több hibát okoz, mint amennyit megspórol.