2.28. JSON

JSON (JavaScript Object Notation) este un format de text compact și lizibil pentru date structurate. Acesta definește șase tipuri – string, number, boolean, null, array și object – fiecare dintre ele corespunzând direct unei valori Python, astfel încât conversia între Python și JSON este un singur apel de funcție în oricare dintre direcții.

JSON este limba universală a fișierelor de configurare și a API-urilor web. Apelează la el ori de câte ori ai nevoie să salvezi pe disc un mic set de setări într-o formă pe care o poți citi și cu ochiul liber, sau să schimbi date structurate cu un alt program.

Două funcții acoperă majoritatea nevoilor:

  • json.dumps()dump string: transformă o valoare Python într-un șir JSON.

  • json.loads()load string: analizează un șir JSON înapoi în Python.

Perechea json.dump / json.load (fără s) face aceeași treabă, dar primește direct un obiect fișier.

2.28.1. Codificare (dumps)

import json

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

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

Rezultat:

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

Corespondența este:

Orice element din afara acestui set (o clasă personalizată, un tampon bytes, un set) generează TypeError. Convertește mai întâi valoarea.

Notă

Funcția json.dumps() din CPython acceptă un argument indent pentru rezultat formatat estetic; cea din MicroPython nu îl acceptă. Singura opțiune de formatare este separators, care controlează spațierea în linie – trimite (',', ':') pentru cea mai compactă formă. Rezultatul pe mai multe linii, indentat, trebuie produs manual dacă este necesar.

2.28.2. Decodificare (loads)

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

Rezultat:

OpenMV 320

Obiectele JSON devin dict, array-urile devin list, iar restul corespund înapoi echivalentelor lor Python. JSON-ul invalid generează ValueError.

2.28.3. Citirea și scrierea fișierelor

Perechea bazată pe fișiere se înțelege bine cu 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)

Tratează fișierul JSON ca pe o înregistrare completă – citește-l, modifică valoarea Python, scrie-l înapoi. Încercarea de a edita JSON pe loc, în interiorul unui fișier, creează de obicei mai multe erori decât economisește.