Ce face json.JSONEncoder și json.JSONDecoder
JSONEncoder face transformarea în JSON. Într-o subclasă suprascrii metoda default(o), apelată pentru obiectele pe care encoderul nu le cunoaște, și o folosești cu json.dumps(..., cls=MeuEncoder). Este echivalentul reutilizabil al parametrului default. Metoda iterencode() produce textul pe bucăți.
JSONDecoder face citirea. Metoda raw_decode(text) citește prima valoare JSON dintr-un text și returnează și poziția unde s-a oprit, utilă pentru texte cu mai multe obiecte JSON unul după altul.
Ce returnează
Obiecte encoder/decoder.
Exemple
Exemplul 1: Encoder pentru date și obiecte proprii
import json
from datetime import datetime
class Produs:
def __init__(self, nume, pret):
self.nume, self.pret = nume, pret
class EncoderMagazin(json.JSONEncoder):
def default(self, o):
if isinstance(o, datetime):
return o.isoformat()
if isinstance(o, Produs):
return {"nume": o.nume, "pret": o.pret}
return super().default(o)
comanda = {"cand": datetime(2026, 10, 19, 14, 30), "produse": [Produs("Cafea", 32.9)]}
print(json.dumps(comanda, cls=EncoderMagazin, ensure_ascii=False))
print(list(EncoderMagazin().iterencode([1, 2])))
Rezultat
{"cand": "2026-10-19T14:30:00", "produse": [{"nume": "Cafea", "pret": 32.9}]}
['[1', ', 2', ']']
Exemplul 2: Mai multe obiecte JSON într-un text
import json
text = '{"id": 1} {"id": 2} {"id": 3}'
dec = json.JSONDecoder()
poz = 0
while poz < len(text):
obiect, poz = dec.raw_decode(text, poz)
print(obiect)
while poz < len(text) and text[poz] == " ":
poz += 1
Rezultat
{'id': 1}
{'id': 2}
{'id': 3}
Greșeli frecvente
- Uiți
return super().default(o)la final: obiectele necunoscute devin tăcutnullîn loc să dea eroare.
Comenzi înrudite
json.dumps(): Transformă un dicționar, o listă sau alte valori Python în text JSON.json.loads(): Transformă un text JSON în valori Python: dicționare, liste, texte, numere.