Menu
Coddy logo textTech

Decodifica JSON personalizzata

Lezione 9 di 9 del corso Python e JSON di Coddy.

La decodifica JSON personalizzata è una funzionalità avanzata del modulo json di Python che ti consente di controllare come i dati JSON vengono convertiti in oggetti Python. È particolarmente utile quando lavori con strutture di dati complesse o quando vuoi creare oggetti Python specifici a partire dai dati JSON.

La classe JSONDecoder

Per implementare una decodifica JSON personalizzata, devi creare una sottoclasse della classe json.JSONDecoder e sovrascrivere il suo metodo object_hook:


import json

class CustomDecoder(json.JSONDecoder):
    def object_hook(self, dct):
        # Logica di decodifica personalizzata qui
        return dct

Usare il decoder personalizzato

Dopo aver definito il tuo decoder personalizzato, puoi usarlo con json.loads() o json.load():


decoded_object = json.loads(json_string, cls=CustomDecoder)

Esempio: decodifica in oggetti personalizzati

Vediamo un esempio pratico in cui decodifichiamo i dati JSON in oggetti Python personalizzati:


import json
from datetime import datetime

class Person:
    def __init__(self, name, birthdate):
        self.name = name
        self.birthdate = birthdate

class CustomDecoder(json.JSONDecoder):
    def object_hook(self, dct):
        if 'name' in dct and 'birthdate' in dct:
            return Person(dct['name'], datetime.fromisoformat(dct['birthdate']))
        return dct

json_string = '{"name": "Alice", "birthdate": "1990-05-15"}'
person = json.loads(json_string, cls=CustomDecoder)

print(type(person))  # Salida: <class '__main__.Person'>
print(person.name)   # Salida: Alice
print(person.birthdate)  # Salida: 1990-05-15 00:00:00

Punti chiave

  • Il metodo object_hook viene chiamato per ogni oggetto decodificato.
  • Puoi controllare chiavi o schemi specifici per determinare come decodificare l'oggetto.
  • Restituisci l'oggetto così com'è se per quella particolare struttura non è necessaria una decodifica personalizzata.
  • I decoder personalizzati sono utili per creare oggetti specifici del dominio direttamente dai dati JSON.

Usando decoder JSON personalizzati, puoi integrare senza difficoltà i dati JSON nel modello a oggetti della tua applicazione Python, rendendo la deserializzazione dei dati più flessibile e in linea con le tue esigenze specifiche.

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 decodificatore JSON personalizzato per un sistema di dati meteorologici. Il decodificatore dovrebbe convertire stringhe JSON in oggetti WeatherData con attributi e conversioni specifici. Implementa quanto segue:

  1. Definisci una classe WeatherData con gli attributi: location, temperature, humidity e conditions.
  2. Crea una sottoclasse personalizzata di JSONDecoder che:
    • Converte la temperatura da Fahrenheit a Celsius, arrotondandola a una cifra decimale.
    • Assicura che l'umidità sia rappresentata come percentuale (ad es., 0.65 diventa 65%).
    • Inizializza con la maiuscola ogni parola nella stringa delle condizioni.
  3. Implementa una funzione che accetta una stringa JSON, la analizza usando il decodificatore personalizzato e restituisce una stringa formattata con i dati meteorologici.

Verrà fornito il seguente input:


{"location": "new york", "temperature": 72, "humidity": 0.65, "conditions": "partly cloudy"}

Stampa la stringa formattata risultante nel seguente formato:

"Location: [location], Temperature: [temp]°C, Humidity: [humidity], Conditions: [conditions]"

Provalo tu

Here's a suitable starter code for the challenge:

```python
import json

# Read input
json_string = input()

class WeatherData:
    def __init__(self, location, temperature, humidity, conditions):
        self.location = location
        self.temperature = temperature
        self.humidity = humidity
        self.conditions = conditions

class CustomJSONDecoder(json.JSONDecoder):
    def __init__(self, *args, **kwargs):
        json.JSONDecoder.__init__(self, object_hook=self.object_hook, *args, **kwargs)

    def object_hook(self, dct):
        # TODO: Implement the custom decoding logic here
        pass

def parse_weather_data(json_string):
    # TODO: Implement the parsing function here
    pass

# TODO: Use the CustomJSONDecoder and parse_weather_data function to process the input

# Placeholder for the result
result = "Location: [location], Temperature: [temp]°C, Humidity: [humidity], Conditions: [conditions]"

# Output the result
print(result)
```

Tutte le lezioni di Python e JSON

Esercitati da solo: Compilatore Python online