Niestandardowe kodowanie JSON
Lekcja 6 z 9 w kursie Python i JSON w Coddy.
Niestandardowe kodowanie JSON to zaawansowana funkcja modułu json w Pythonie, która pozwala serializować złożone obiekty Pythona, które nie są natywnie obsługiwane przez JSON. Jest to szczególnie przydatne podczas pracy z niestandardowymi klasami lub obiektami, które nie mają bezpośredniej reprezentacji w JSON.
Klasa JSONEncoder
Aby utworzyć niestandardowy koder JSON, musisz utworzyć podklasę klasy json.JSONEncoder i nadpisać jej metodę default():
import json
class CustomEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, YourCustomClass):
return obj.to_dict() # Przekształć swój obiekt w słownik
return json.JSONEncoder.default(self, obj)
Korzystanie z niestandardowego kodera
Po zdefiniowaniu niestandardowego kodera możesz używać go z json.dumps() lub json.dump():
json_string = json.dumps(your_object, cls=CustomEncoder)
Przykład: kodowanie niestandardowej klasy
Przyjrzyjmy się praktycznemu przykładowi:
import json
from datetime import datetime
class Person:
def __init__(self, name, birthdate):
self.name = name
self.birthdate = birthdate
class CustomEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Person):
return {"name": obj.name, "birthdate": obj.birthdate.isoformat()}
elif isinstance(obj, datetime):
return obj.isoformat()
return json.JSONEncoder.default(self, obj)
person = Person("Alice", datetime(1990, 5, 15))
json_string = json.dumps(person, cls=CustomEncoder, indent=2)
print(json_string)
Ten przykład pokazuje, jak zakodować niestandardową klasę Person i obsłużyć zawarty w niej obiekt datetime.
Najważniejsze informacje
- Metoda
default()jest wywoływana dla obiektów, które nie są natywnie serializowalne. - Zawsze zapewnij możliwość powrotu do domyślnego kodera w przypadku nieznanych typów.
- Niestandardowe kodery są przydatne do obsługi złożonych struktur danych, niestandardowych klas i niestandardowych typów Pythona.
Korzystając z niestandardowych koderów JSON, możesz bezproblemowo integrować złożone obiekty Pythona z przepływami pracy JSON, dzięki czemu serializacja danych staje się bardziej elastyczna i zaawansowana.
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 własny enkoder JSON dla klasy ComplexNumber. Enkoder powinien konwertować liczby zespolone na obiekt JSON z kluczami 'real' i 'imag', odpowiednio dla części rzeczywistej i urojonej.
- Zdefiniuj klasę
ComplexNumberz atrybutamirealiimag. - Utwórz własną podklasę
JSONEncoder, która obsługuje obiektyComplexNumber. - Zaimplementuj funkcję, która przyjmuje listę obiektów
ComplexNumberi zwraca reprezentację w postaci ciągu JSON, używając własnego enkodera.
Otrzymasz następujące dane wejściowe:
3.14,2.71
1.41,-1.73
2.0,0
0,-1
Każdy wiersz przedstawia liczbę zespoloną, której części rzeczywista i urojona są oddzielone przecinkiem.
Wypisz wynikowy ciąg JSON. Upewnij się, że JSON jest sformatowany z wcięciem wynoszącym 2 spacje.
Spróbuj swoich sił
import json
# Odczytaj dane wejściowe
complex_numbers = []
while True:
try:
line = input().strip()
if line:
real, imag = map(float, line.split(','))
complex_numbers.append((real, imag))
except EOFError:
break
class ComplexNumber:
def __init__(self, real, imag):
self.real = real
self.imag = imag
# TODO: Utwórz własną podklasę JSONEncoder obsługującą obiekty ComplexNumber
# TODO: Zaimplementuj funkcję, która przyjmuje listę obiektów ComplexNumber i zwraca ciąg znaków JSON
# TODO: Przekształć dane wejściowe w obiekty ComplexNumber i użyj swojej funkcji do utworzenia ciągu znaków JSON
# Wypisz wynikowy ciąg znaków JSON
print(json_string)Wszystkie lekcje w sekcji Python i JSON
Poćwicz samodzielnie: Kompilator Python online