Menu
Coddy logo textTech

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.

quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

challenge icon

Sfida

Facile

Crea 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.

  1. Definisci una classe ComplexNumber con gli attributi real e imag.
  2. Crea una sottoclasse personalizzata di JSONEncoder che gestisca gli oggetti ComplexNumber.
  3. Implementa una funzione che accetti un elenco di oggetti ComplexNumber e 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