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ří.