Menu
Coddy logo textTech

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_hook wird 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.

quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

challenge icon

Aufgabe

Einfach

Erstellen 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:

  1. Definieren Sie eine WeatherData-Klasse mit den Attributen: location, temperature, humidity und conditions.
  2. 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.
  3. 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)
```

Alle Lektionen in Python JSON