Từ JSON đến lớp dữ liệu Python

Dán một mẫu JSON để nhận được đối tượng @dataclass (hoặc Pydantic BaseModel) kèm các gợi ý kiểu cho từng trường, str, int, float, bool, Optional[...]List[...] khi cần thiết. Các đối tượng lồng ghép sẽ trở thành các lớp dữ liệu riêng biệt. Kết quả đầu ra được định dạng theo PEP 8 và sẵn sàng để dán vào tệp Python.

Cách chuyển đổi JSON thành lớp dữ liệu

  1. 1

    Dán JSON

    Một mẫu duy nhất đã đủ; nhiều mẫu sẽ giúp phát hiện chính xác hơn những trường có thể nhận giá trị null.

  2. 2

    Chọn phong cách

    Thư viện tiêu chuẩn `@dataclass`, Pydantic `BaseModel` hoặc `TypedDict` dành riêng cho kiểm tra kiểu tĩnh.

  3. 3

    Chọn phiên bản Python

    3.9+ cho cú pháp `list[str]`; 3.10+ cho các kiểu hợp `|`; 3.8 cho `Optional[...]`/`List[...]`.

  4. 4

    Sao chép mã

    Một lớp gốc cùng các lớp con được đặt bên trong; dán vào tệp `.py` rồi nhập vào hệ thống.

Ví dụ về kết quả đầu ra: tiêu chuẩn @dataclass

Nội dung đầu vào:

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

Kết quả đầu ra (Python 3.10 trở lên):

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

Cùng đầu vào với Pydantic

from typing import Optional
from pydantic import BaseModel


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

Xác định kiểu dữ liệu

Giá trị JSON Loại dữ liệu trong Python
chuỗi văn bản str
số nguyên int
Số (dạng thập phân) float
boolean bool
null (xem riêng lẻ) None
null + loại khác Optional[T]
Dãy ngày ISO date (Python 3.7+)
Ngày tháng định dạng ISO datetime
mảng của một loại list[T]
mảng hỗn hợp list[Union[T1, T2]]
đối tượng lớp lồng ghép

Dataclass so với Pydantic và TypedDict

Biến thể Thời điểm sử dụng
@dataclass Giải pháp thư viện tiêu chuẩn, không yêu cầu xác thực trong thời gian chạy
Pydantic Xác thực và ép kiểu trong thời gian chạy (FastAPI, cài đặt)
TypedDict Chỉ kiểm tra kiểu tĩnh, không xác định lớp đối tượng
attrs Các dự án cũ đã được chuẩn hóa theo attrs

Các lỗi phổ biến

  • Quên default_factory cho các giá trị mặc định có thể thay đổi. Giá trị mặc định list[str] = [] là một “bẫy” của lớp dữ liệu (bị chia sẻ giữa các đối tượng). Hãy sử dụng field(default_factory=list).
  • Optional mà không có giá trị mặc định. Dù không có = None, email: Optional[str] vẫn yêu cầu tham số này. Hãy đảm bảo phù hợp với ngữ nghĩa JSON của bạn.
  • Pydantic v1 so với v2. Cú pháp và cách hoạt động khác nhau (lớp Config so với model_config, validator so với field_validator). Bộ tạo mặc định dùng v2.
  • Thứ tự trong union quan trọng đối với việc giải tuần tự hóa. Pydantic thử các kiểu theo thứ tự khai báo; nếu có khả năng gây nhầm lẫn, hãy đặt kiểu cụ thể nhất lên đầu (ví dụ: int trước str).

Câu hỏi thường gặp

Lớp dữ liệu dành cho các giá trị đơn giản không yêu cầu xác thực. Lớp Pydantic khi bạn cần xác thực trong thời gian chạy, ép kiểu hoặc tích hợp với FastAPI. Lớp TypedDict khi bạn chỉ cần kiểm tra kiểu tĩnh (như trong mypy, pyright) và không cần các đối tượng lớp.

Không phù hợp với Python phiên bản 3.10 trở lên, nơi các cấu trúc union | và cú pháp list[str] là vốn có. Có ích cho các dự án từ phiên bản 3.7 đến 3.9 để sử dụng cú pháp mới thông qua các chú thích chuỗi theo PEP 563. Bộ tạo sẽ cảnh báo khi cần thiết.

Mỗi đối tượng lồng vào nhau đều trở thành một lớp riêng biệt. Lớp gốc tham chiếu đến chúng bằng tên, giúp bạn có thể tái sử dụng các kiểu dữ liệu. Các tham chiếu vòng sẽ được phát hiện và đánh dấu.

Đúng vậy, nếu bạn chọn phiên bản Pydantic. FastAPI sử dụng các mô hình Pydantic trực tiếp làm kiểu yêu cầu và phản hồi. Đối với việc xử lý dữ liệu nội bộ, @dataclass có cấu trúc nhẹ hơn.

Công cụ liên quan

Công cụ này có phiên bản bằng các ngôn ngữ khác