Menu
Coddy logo textTech

Niestandardowe odczytywanie JSON

Lekcja 9 z 9 w kursie Python i JSON w Coddy.

Niestandardowe dekodowanie JSON to zaawansowana funkcja modułu json w Pythonie, która pozwala kontrolować sposób konwertowania danych JSON na obiekty Pythona. Jest to szczególnie przydatne podczas pracy ze złożonymi strukturami danych lub gdy chcesz tworzyć określone obiekty Pythona na podstawie danych JSON.

Klasa JSONDecoder

Aby zaimplementować niestandardowe dekodowanie JSON, musisz utworzyć podklasę klasy json.JSONDecoder i nadpisać jej metodę object_hook:


import json

class CustomDecoder(json.JSONDecoder):
    def object_hook(self, dct):
        # Tutaj niestandardowa logika dekodowania
        return dct

Korzystanie z niestandardowego dekodera

Po zdefiniowaniu niestandardowego dekodera możesz używać go z json.loads() lub json.load():


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

Przykład: dekodowanie do niestandardowych obiektów

Przyjrzyjmy się praktycznemu przykładowi, w którym dekodujemy dane JSON do niestandardowych obiektów Pythona:


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))  # Wynik: <class '__main__.Person'>
print(person.name)   # Wynik: Alice
print(person.birthdate)  # Wynik: 1990-05-15 00:00:00

Najważniejsze informacje

  • Metoda object_hook jest wywoływana dla każdego zdekodowanego obiektu.
  • Możesz sprawdzać określone klucze lub wzorce, aby ustalić, jak dekodować obiekt.
  • Zwróć obiekt bez zmian, jeśli dla danej struktury nie jest potrzebne niestandardowe dekodowanie.
  • Niestandardowe dekodery przydają się do tworzenia obiektów specyficznych dla danej domeny bezpośrednio na podstawie danych JSON.

Korzystając z niestandardowych dekoderów JSON, możesz płynnie integrować dane JSON z modelem obiektowym swojej aplikacji w Pythonie, dzięki czemu deserializacja danych staje się bardziej elastyczna i lepiej dopasowana do Twoich konkretnych potrzeb.

quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

challenge icon

Wyzwanie

Łatwy

Utwórz niestandardowy dekoder JSON dla systemu danych pogodowych. Dekoder powinien przekształcać ciągi JSON w obiekty WeatherData z określonymi atrybutami i konwersjami. Zaimplementuj następujące elementy:

  1. Zdefiniuj klasę WeatherData z atrybutami: location, temperature, humidity i conditions.
  2. Utwórz niestandardową podklasę JSONDecoder, która:
    • Konwertuje temperaturę ze stopni Fahrenheita na stopnie Celsjusza, zaokrąglając wynik do jednego miejsca po przecinku.
    • Zapewnia, że wilgotność jest wyrażona jako wartość procentowa (np. 0.65 oznacza 65%).
    • Zapisuje wielką literą pierwszą literę każdego słowa w ciągu warunków pogodowych.
  3. Zaimplementuj funkcję, która przyjmuje ciąg JSON, używa niestandardowego dekodera do jego przetworzenia i zwraca sformatowany ciąg z danymi pogodowymi.

Podane zostanie następujące wejście:


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

Wyświetl wynikowy sformatowany ciąg w następującym formacie:

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

Spróbuj swoich sił

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)
```

Wszystkie lekcje w sekcji Python i JSON

Poćwicz samodzielnie: Kompilator Python online