json.JSONEncoder și json.JSONDecoder în Python

JSON Python 3.0+

Clasele din spatele lui dumps() și loads(), extensibile pentru tipuri proprii.

Sintaxă
class MeuEncoder(json.JSONEncoder):
    def default(self, o): ...
json.dumps(obiect, cls=MeuEncoder)

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ăcut null î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.