Décodage JSON personnalisé
Leçon 9 sur 9 du cours Python et JSON de Coddy.
Le décodage JSON personnalisé est une fonctionnalité avancée du module json de Python qui vous permet de contrôler la manière dont les données JSON sont converties en objets Python. Cela est particulièrement utile lorsque vous traitez des structures de données complexes ou lorsque vous souhaitez créer des objets Python spécifiques à partir de données JSON.
La classe JSONDecoder
Pour implémenter un décodage JSON personnalisé, vous devez créer une sous-classe de la classe json.JSONDecoder et surcharger sa méthode object_hook :
import json
class CustomDecoder(json.JSONDecoder):
def object_hook(self, dct):
# Logique de décodage personnalisée ici
return dct
Utilisation du décodeur personnalisé
Une fois que vous avez défini votre décodeur personnalisé, vous pouvez l'utiliser avec json.loads() ou json.load() :
decoded_object = json.loads(json_string, cls=CustomDecoder)
Exemple : Décodage vers des objets personnalisés
Examinons un exemple pratique où nous décodons des données JSON en objets Python personnalisés :
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)) # Sortie : <class '__main__.Person'>
print(person.name) # Sortie : Alice
print(person.birthdate) # Sortie : 1990-05-15 00:00:00
Points clés
- La méthode
object_hookest appelée pour chaque objet décodé. - Vous pouvez vérifier des clés ou des motifs spécifiques pour déterminer comment décoder l'objet.
- Renvoyez l'objet tel quel si aucun décodage personnalisé n'est nécessaire pour cette structure particulière.
- Les décodeurs personnalisés sont utiles pour créer des objets spécifiques au domaine directement à partir de données JSON.
En utilisant des décodeurs JSON personnalisés, vous pouvez intégrer de manière transparente les données JSON dans le modèle d'objet de votre application Python, rendant la désérialisation des données plus flexible et alignée sur vos besoins spécifiques.
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Défi
FacileCréez un décodeur JSON personnalisé pour un système de données météorologiques. Le décodeur doit convertir des chaînes JSON en objets WeatherData avec des attributs et des conversions spécifiques. Implémentez ce qui suit :
- Définissez une classe
WeatherDataavec les attributs :location,temperature,humidityetconditions. - Créez une sous-classe
JSONDecoderpersonnalisée qui :- Convertit la température de Fahrenheit en Celsius, arrondie à une décimale.
- S'assure que l'humidité est représentée sous forme de pourcentage (par exemple, 0.65 devient 65%).
- Met en majuscule chaque mot de la chaîne
conditions.
- Implémentez une fonction qui prend une chaîne JSON, utilise le décodeur personnalisé pour l'analyser et renvoie une chaîne formatée avec les données météorologiques.
L'entrée suivante sera fournie :
{"location": "new york", "temperature": 72, "humidity": 0.65, "conditions": "partly cloudy"}
Affichez la chaîne formatée résultante au format suivant :
"Location: [location], Temperature: [temp]°C, Humidity: [humidity], Conditions: [conditions]"
Essayez vous-même
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)
```