JSON do klasy danych w Pythonie

Wklej przykładowy kod JSON, a otrzymasz @dataclass (lub Pydantic BaseModel) ze wskazówkami typów dla każdego pola: str, int, float, bool, Optional[...] oraz List[...] tam, gdzie to właściwe. Obiekty zagnieżdżone stają się osobnymi klasami danych. Wynik jest sformatowany zgodnie z PEP 8 i gotowy do wklejenia do pliku Pythona.

Jak przekształcić JSON w klasę danych

  1. 1

    Wklej plik JSON

    Wystarczy jedna próbka; wiele próbek poprawia wykrywanie pól, które mogą przyjmować wartość null.

  2. 2

    Wybierz styl

    Biblioteka standardowa `@dataclass`, Pydantic `BaseModel` lub `TypedDict` wyłącznie do statycznej kontroli typów.

  3. 3

    Wybierz wersję Pythona

    3.9+ dla składni `list[str]`, 3.10+ dla typów unii `|`, 3.8 dla `Optional[...]`/`List[...]`.

  4. 4

    Skopiuj kod

    Jedna klasa główna oraz klasy zagnieżdżone. Wklej je do pliku `.py` i zaimportuj.

Przykład wyniku – standardowy @dataclass

Wejście:

{ "first_name": "Alice", "age": 30, "email": null, "tags": ["admin"] }

Wyjście (Python 3.10+)

from dataclasses import dataclass, field
from typing import Optional


@dataclass
class User:
    first_name: str
    age: int
    tags: list[str] = field(default_factory=list)
    email: Optional[str] = None

To samo wejście z Pydantic

from typing import Optional
from pydantic import BaseModel


class User(BaseModel):
    first_name: str
    age: int
    email: Optional[str] = None
    tags: list[str] = []

Mapowanie typów

Wartość JSON Typ w Pythonie
ciąg znaków str
liczba całkowita int
liczba (dziesiętna) float
wartość logiczna bool
null (występuje samodzielnie) None
null + inny typ Optional[T]
ciąg daty ISO date (Python 3.7+)
data i godzina ISO datetime
tablica jednego typu list[T]
tablica mieszana list[Union[T1, T2]]
obiekt klasa zagnieżdżona

Dataclass vs Pydantic vs TypedDict

Wariant Kiedy stosować
@dataclass Rozwiązanie z biblioteki standardowej, bez walidacji w czasie wykonania
Pydantic Walidacja i konwersja typów w czasie wykonania (FastAPI, ustawienia)
TypedDict Tylko statyczna kontrola typów, bez klasy instancji
attrs Starsze projekty, które ustandaryzowały się na attrs

Najczęstsze błędy

  • Pominięcie default_factory dla zmiennych wartości domyślnych. Wartość domyślna list[str] = [] to pułapka dataclass (współdzielona między instancjami). Użyj field(default_factory=list).
  • Optional bez wartości domyślnej. email: Optional[str] bez = None nadal wymaga podania argumentu. Dopasuj to do semantyki swojego JSON-a.
  • Pydantic v1 a v2. Składnia i zachowanie różnią się (klasa Config a model_config, validator a field_validator). Generator domyślnie używa v2.
  • Kolejność w unii ma znaczenie przy deserializacji. Pydantic próbuje typów w kolejności deklaracji. Umieść najbardziej szczegółowy typ jako pierwszy (np. int przed str), jeśli możliwa jest niejednoznaczność.

Najczęściej zadawane pytania

Klasa danych do prostych obiektów bez żadnej walidacji. Pydantic, gdy potrzebujesz walidacji w czasie wykonania, konwersji typów lub integracji z FastAPI. TypedDict, gdy wymagana jest wyłącznie statyczna kontrola typów (np. w narzędziach takich jak mypy lub pyright) i nie potrzebujesz instancji klasy.

Niepotrzebny w Pythonie 3.10+, gdzie typy unii | oraz składnia list[str] są natywne. Przydatny w projektach 3.7–3.9 do stosowania nowszej składni za pomocą łańcuchowych adnotacji zgodnych z PEP 563. Generator ostrzega, gdy jest wymagany.

Każdy obiekt zagnieżdżony staje się osobną klasą. Klasa główna odwołuje się do nich po nazwie, dzięki czemu można ponownie wykorzystywać typy. Odwołania cykliczne są wykrywane i oznaczane.

Tak, jeśli wybierzesz wariant Pydantic. FastAPI bezpośrednio wykorzystuje modele Pydantic jako typy żądań i odpowiedzi. Do wewnętrznego przenoszenia danych @dataclass jest lżejszym rozwiązaniem.

Powiązane narzędzia

Narzędzie jest dostępne w innych językach