Benutzerdefinierte JSON-Dekodierung
Lektion 9 von 9 im Kurs Python JSON von Coddy.
Benutzerdefiniertes JSON-Dekodieren ist eine fortgeschrittene Funktion des json-Moduls von Python, mit der Sie steuern können, wie JSON-Daten in Python-Objekte umgewandelt werden. Dies ist besonders nützlich beim Umgang mit komplexen Datenstrukturen oder wenn Sie spezifische Python-Objekte aus JSON-Daten erstellen möchten.
Die JSONDecoder-Klasse
Um eine benutzerdefinierte JSON-Dekodierung zu implementieren, müssen Sie eine Unterklasse der Klasse json.JSONDecoder erstellen und deren Methode object_hook überschreiben:
import json
class CustomDecoder(json.JSONDecoder):
def object_hook(self, dct):
# Benutzerdefinierte Dekodierungslogik hier
return dct
Verwendung des benutzerdefinierten Decoders
Sobald Sie Ihren benutzerdefinierten Decoder definiert haben, können Sie ihn mit json.loads() oder json.load() verwenden:
decoded_object = json.loads(json_string, cls=CustomDecoder)
Beispiel: Dekodieren in benutzerdefinierte Objekte
Schauen wir uns ein praktisches Beispiel an, bei dem wir JSON-Daten in benutzerdefinierte Python-Objekte dekodieren:
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)) # Ausgabe: <class '__main__.Person'>
print(person.name) # Ausgabe: Alice
print(person.birthdate) # Ausgabe: 1990-05-15 00:00:00
Wichtige Punkte
- Die Methode
object_hookwird für jedes dekodierte Objekt aufgerufen. - Sie können nach bestimmten Schlüsseln oder Mustern suchen, um zu bestimmen, wie das Objekt dekodiert werden soll.
- Geben Sie das Objekt unverändert zurück, wenn für diese spezifische Struktur keine benutzerdefinierte Dekodierung erforderlich ist.
- Benutzerdefinierte Decoder sind nützlich, um domänenspezifische Objekte direkt aus JSON-Daten zu erstellen.
Durch die Verwendung benutzerdefinierter JSON-Decoder können Sie JSON-Daten nahtlos in das Objektmodell Ihrer Python-Anwendung integrieren, wodurch die Deserialisierung von Daten flexibler wird und auf Ihre spezifischen Anforderungen abgestimmt werden kann.
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Aufgabe
EinfachErstellen Sie einen benutzerdefinierten JSON-Decoder für ein Wetterdatensystem. Der Decoder soll JSON-Strings in WeatherData-Objekte mit spezifischen Attributen und Konvertierungen umwandeln. Implementieren Sie Folgendes:
- Definieren Sie eine
WeatherData-Klasse mit den Attributen:location,temperature,humidityundconditions. - Erstellen Sie eine benutzerdefinierte
JSONDecoder-Unterklasse, die:- Die Temperatur von Fahrenheit in Celsius umrechnet, gerundet auf eine Dezimalstelle.
- Sicherstellt, dass die Luftfeuchtigkeit als Prozentsatz dargestellt wird (z. B. wird 0.65 zu 65%).
- Jedes Wort in der Zeichenfolge für die Bedingungen (conditions) großschreibt.
- Implementieren Sie eine Funktion, die einen JSON-String entgegennimmt, den benutzerdefinierten Decoder zum Parsen verwendet und einen formatierten String mit den Wetterdaten zurückgibt.
Die folgende Eingabe wird bereitgestellt:
{"location": "new york", "temperature": 72, "humidity": 0.65, "conditions": "partly cloudy"}
Geben Sie den resultierenden formatierten String im folgenden Format aus:
"Location: [location], Temperature: [temp]°C, Humidity: [humidity], Conditions: [conditions]"
Probier es selbst
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)
```