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_hookviene 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.
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 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:
- Definisci una classe
WeatherDatacon gli attributi:location,temperature,humidityeconditions. - Crea una sottoclasse personalizzata di
JSONDecoderche:- 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.
- 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