2.28. JSON¶
JSON (JavaScript Object Notation) je kompaktní, lidsky čitelný textový formát pro strukturovaná data. Definuje šest typů – string, number, boolean, null, array a object – z nichž každý se přímo mapuje na nějakou hodnotu v Pythonu, takže převod mezi Pythonem a JSON je jediné volání funkce v obou směrech.
JSON je společným jazykem konfiguračních souborů a webových API. Sáhněte po něm, kdykoli potřebujete uložit malý balík nastavení na disk ve formě, kterou lze přečíst i okem, nebo vyměňovat strukturovaná data s jiným programem.
Dvě funkce pokryjí většinu potřeb:
json.dumps()– dump string: převede hodnotu Pythonu na řetězec JSON.json.loads()– load string: parsuje řetězec JSON zpět na hodnotu Pythonu.
Dvojice json.dump / json.load (bez s) dělá stejnou práci, ale přijímá přímo souborový objekt.
2.28.1. Kódování (dumps)¶
import json
config = {
"name": "OpenMV",
"width": 320,
"tags": ["red", "round"],
}
text = json.dumps(config)
print(text)
Výstup:
{"name": "OpenMV", "width": 320, "tags": ["red", "round"]}
Mapování je následující:
Cokoli mimo tuto množinu (vlastní třída, buffer bytes, set) vyvolá TypeError. Hodnotu nejprve převeďte.
Poznámka
CPythonovský json.dumps() přijímá argument indent pro hezky naformátovaný výstup; MicroPython jej nepřijímá. Jediným ovládacím prvkem formátování je separators, který řídí mezery uvnitř řádku – předejte (',', ':') pro nejkompaktnější formu. Víceřádkový, odsazený výstup je v případě potřeby nutné vyrobit ručně.
2.28.2. Dekódování (loads)¶
text = '{"name": "OpenMV", "width": 320}'
config = json.loads(text)
print(config["name"], config["width"])
Výstup:
OpenMV 320
Objekty JSON se stanou dict, pole se stanou list a zbytek se namapuje zpět na své obdoby v Pythonu. Špatný JSON vyvolá ValueError.
2.28.3. Čtení a zápis souborů¶
Souborová dvojice dobře spolupracuje s 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)
K souboru JSON přistupujte jako k úplnému záznamu – načtěte jej, upravte hodnotu Pythonu a zapište jej zpět. Pokus o úpravu JSON na místě uvnitř souboru obvykle vytvoří více chyb, než kolik ušetří.