2.28. JSON

JSON (JavaScript Object Notation) on tiivis, ihmisluettava tekstimuoto jäsennellylle datalle. Se määrittelee kuusi tyyppiä – string, number, boolean, null, array ja object – joista kukin vastaa suoraan jotain Python-arvoa, joten Pythonin ja JSONin välinen muunnos on yksittäinen funktiokutsu kumpaankin suuntaan.

JSON on asetustiedostojen ja web-rajapintojen yleiskieli. Tartu siihen aina, kun sinun täytyy tallentaa pieni nippu asetuksia levylle myös silmin luettavassa muodossa tai vaihtaa jäsenneltyä dataa toisen ohjelman kanssa.

Kaksi funktiota kattaa useimmat tarpeet:

  • json.dumps()dump string: muuntaa Python-arvon JSON-merkkijonoksi.

  • json.loads()load string: jäsentää JSON-merkkijonon takaisin Pythoniksi.

Pari json.dump / json.load (ilman s -kirjainta) tekee saman työn, mutta ottaa tiedosto-olion suoraan.

2.28.1. Enkoodaus (dumps)

import json

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

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

Tuloste:

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

Vastaavuus on:

Mikä tahansa tämän joukon ulkopuolinen (mukautettu luokka, bytes -puskuri, set) nostaa TypeError -poikkeuksen. Muunna arvo ensin.

Muista

CPythonin json.dumps() hyväksyy indent -argumentin siistitysti muotoiltua tulostetta varten; MicroPythonin ei. Ainoa muotoilunuppi on separators, joka hallitsee sisäistä välistystä – anna (',', ':') tiiveimpään muotoon. Monirivinen, sisennetty tuloste on tarvittaessa tuotettava käsin.

2.28.2. Dekoodaus (loads)

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

Tuloste:

OpenMV 320

JSON-objekteista tulee dict, taulukoista list, ja loput vastaavat takaisin Python-vastineitaan. Virheellinen JSON nostaa ValueError -poikkeuksen.

2.28.3. Tiedostojen lukeminen ja kirjoittaminen

Tiedostopohjainen pari toimii hyvin with -lauseen kanssa:

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äsittele JSON-tiedostoa kokonaisena tietueena – lue se sisään, muokkaa Python-arvoa, kirjoita se takaisin. JSONin muokkaaminen paikallaan tiedoston sisällä luo yleensä enemmän bugeja kuin säästää.