Codifica JSON personalizzata
Lezione 6 di 9 del corso Python e JSON di Coddy.
La codifica JSON personalizzata è una potente funzionalità del modulo json di Python che ti consente di serializzare oggetti Python complessi che non sono supportati nativamente da JSON. È particolarmente utile quando lavori con classi o oggetti personalizzati che non hanno una rappresentazione JSON diretta.
La classe JSONEncoder
Per creare un codificatore JSON personalizzato, devi creare una sottoclasse della classe json.JSONEncoder e sovrascrivere il suo metodo default():
import json
class CustomEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, YourCustomClass):
return obj.to_dict() # Converti il tuo oggetto in un dizionario
return json.JSONEncoder.default(self, obj)
Usare il codificatore personalizzato
Una volta definito il tuo codificatore personalizzato, puoi usarlo con json.dumps() o json.dump():
json_string = json.dumps(your_object, cls=CustomEncoder)
Esempio: codificare una classe personalizzata
Vediamo un esempio pratico:
import json
from datetime import datetime
class Person:
def __init__(self, name, birthdate):
self.name = name
self.birthdate = birthdate
class CustomEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Person):
return {"name": obj.name, "birthdate": obj.birthdate.isoformat()}
elif isinstance(obj, datetime):
return obj.isoformat()
return json.JSONEncoder.default(self, obj)
person = Person("Alice", datetime(1990, 5, 15))
json_string = json.dumps(person, cls=CustomEncoder, indent=2)
print(json_string)
Questo esempio mostra come codificare una classe personalizzata Person e gestire l'oggetto datetime al suo interno.
Punti chiave
- Il metodo
default()viene chiamato per gli oggetti che non sono serializzabili nativamente. - Prevedi sempre un modo per ricorrere al codificatore predefinito per i tipi sconosciuti.
- I codificatori personalizzati sono utili per gestire strutture dati complesse, classi personalizzate e tipi Python non standard.
Usando codificatori JSON personalizzati, puoi integrare senza problemi i tuoi oggetti Python complessi nei flussi di lavoro JSON, rendendo la serializzazione dei dati più flessibile e potente.
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Sfida
FacileCrea un encoder JSON personalizzato per una classe ComplexNumber. L'encoder dovrebbe convertire i numeri complessi in un oggetto JSON con le chiavi 'real' e 'imag' per le parti reale e immaginaria, rispettivamente.
- Definisci una classe
ComplexNumbercon gli attributirealeimag. - Crea una sottoclasse personalizzata di
JSONEncoderche gestisca gli oggettiComplexNumber. - Implementa una funzione che accetti un elenco di oggetti
ComplexNumbere restituisca una rappresentazione in forma di stringa JSON utilizzando l'encoder personalizzato.
Verrà fornito il seguente input:
3.14,2.71
1.41,-1.73
2.0,0
0,-1
Ogni riga rappresenta un numero complesso con le parti reale e immaginaria separate da una virgola.
Stampa la stringa JSON risultante. Assicurati che il JSON sia formattato con un rientro di 2 spazi.
Provalo tu
import json
# Leggi l'input
complex_numbers = []
while True:
try:
line = input().strip()
if line:
real, imag = map(float, line.split(','))
complex_numbers.append((real, imag))
except EOFError:
break
class ComplexNumber:
def __init__(self, real, imag):
self.real = real
self.imag = imag
# TODO: Crea una sottoclasse personalizzata di JSONEncoder che gestisca gli oggetti ComplexNumber
# TODO: Implementa una funzione che accetti una lista di oggetti ComplexNumber e restituisca una stringa JSON
# TODO: Converti i dati di input in oggetti ComplexNumber e usa la tua funzione per creare la stringa JSON
# Stampa la stringa JSON risultante
print(json_string)Tutte le lezioni di Python e JSON
Esercitati da solo: Compilatore Python online