Menu
Coddy logo textTech

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.

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

  1. Zdefiniuj klasę ComplexNumber z atrybutami real i imag.
  2. Utwórz własną podklasę JSONEncoder, która obsługuje obiekty ComplexNumber.
  3. Zaimplementuj funkcję, która przyjmuje listę obiektów ComplexNumber i 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