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_hookjest 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.
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wyzwanie
ŁatwyUtwó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:
- Zdefiniuj klasę
WeatherDataz atrybutami:location,temperature,humidityiconditions. - 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.
- 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