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[...] và 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
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
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
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
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_factorycho các giá trị mặc định có thể thay đổi. Giá trị mặc địnhlist[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ụngfield(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
Configso vớimodel_config,validatorso vớifield_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ụ:
inttrướcstr).
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
Bảng tham chiếu ASCII
Bảng ASCII đầy đủ từ 0 đến 127 với giá trị thập phân, thập lục phân, bát phân, nhị phân và ký hiệu tham chiếu ký tự số HTML, gồm NUL, LF và DEL.
Tham chiếu ký tự HTML
Danh sách có thể tìm kiếm các thực thể HTML, mã tên và mã số tương ứng của chúng, cùng chức năng sao chép chỉ với một cú nhấp cho các ký tự đặc biệt và biểu tượng.
Bảng tham khảo phím tắt
Tìm phím tắt mặc định theo tài liệu của VS Code, Chrome và Bash dùng GNU Readline trên macOS, Windows và Linux.
Trình định dạng HTML
Định dạng HTML cục bộ trong trình duyệt với thụt lề hai hoặc bốn khoảng trắng. HTML không được tải lên hoặc xác thực.
Bảng tra cứu nhanh Markdown
Tài liệu Markdown thực dụng với bản xem trước thực tế và ví dụ có thể sao chép cho tiêu đề, danh sách, bảng, mã, liên kết, hình ảnh và cú pháp GFM.
Bảng Tra Regex
Tài liệu tham chiếu biểu thức chính quy có thể tìm kiếm cho JavaScript, PCRE2/PHP, Python re và .NET. So sánh mã thông báo, cú pháp riêng của máy, neo, nhóm, lookaround và cờ.
Công cụ này có phiên bản bằng các ngôn ngữ khác
- JSON a Dataclass de Python [ES]
- JSON vers Dataclass Python [FR]
- JSONからPythonデータクラスへの変換 [JA]
- JSON para Dataclass em Python [PT]
- JSON till Python-dataklass [SV]
- JSON ถึงคลาสข้อมูลใน Python [TH]
- فئة بيانات من JSON إلى بايثون [AR]
- JSON zu Python Dataclass [DE]
- JSON에서 Python 데이터 클래스로 변환하기 [KO]
- JSON ke Dataclass Python [ID]
- JSON naar Python-dataclass [NL]
- JSON do klasy danych w Pythonie [PL]
- JSON в класс данных для Python [RU]
- JSON'dan Python Veri Sınıfına [TR]
- 从 JSON 到 Python 数据类 [ZH]
- JSON to Python Dataclass [EN]
- JSON in Dataclass Python [IT]