JSON в класс данных для Python
Вставьте пример JSON-данных и получите файл формата @dataclass (или Pydantic BaseModel) с указанием типов для всех полей, str, int, float, bool, Optional[...] и List[...] в соответствующих случаях. Вложенные объекты становятся отдельными классами данных. Результат выводится в формате PEP 8 и готов к вставке в Python-файл.
Как преобразовать JSON в класс данных
-
1
Вставьте JSON
Достаточно одного образца; использование нескольких образцов улучшает определение того, какие поля могут быть null.
-
2
Выберите стиль
Стандартная библиотека `@dataclass`, Pydantic `BaseModel` или `TypedDict`, только для статической проверки типов.
-
3
Выберите версию Python
3.9+ для синтаксиса `list[str]`, 3.10+ для типов объединений `|`, 3.8 для `Optional[...]` и `List[...]`.
-
4
Копируйте код
Один основной класс с вложёнными классами. Вставьте его в файл `.py` и импортируйте.
Пример результата: стандартный @dataclass
Ввод:
{ "first_name": "Alice", "age": 30, "email": null, "tags": ["admin"] }
Результат выполнения (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
Тот же ввод с Pydantic
from typing import Optional
from pydantic import BaseModel
class User(BaseModel):
first_name: str
age: int
email: Optional[str] = None
tags: list[str] = []
Маппинг типов
| Значение в формате JSON | Тип в Python |
|---|---|
| строка | str |
| целое число | int |
| число (десятичное) | float |
| логическое значение | bool |
| null (присутствует только в отдельности) | None |
| null + другой тип | Optional[T] |
| Дата в формате ISO | date (Python 3.7+) |
| Дата и время ISO | datetime |
| Массив одного типа | list[T] |
| смешанный массив | list[Union[T1, T2]] |
| объект | вложенный класс |
Dataclass, Pydantic и TypedDict
| Вариант | Когда использовать |
|---|---|
@dataclass |
Решение из стандартной библиотеки; проверка во время выполнения отсутствует |
| Pydantic | Валидация и принудительное преобразование данных во время выполнения (FastAPI, настройки) |
TypedDict |
Только статическая проверка типов; класс экземпляра не создаётся |
attrs |
Старые проекты, стандартизированные на attrs |
Распространённые ошибки
- Забывание про
default_factoryдля изменяемых значений по умолчанию. Значениеlist[str] = []представляет собой ловушку класса данных (общую для всех экземпляров); используйтеfield(default_factory=list). - Optional без значения по умолчанию.
email: Optional[str]без= Noneвсё равно требует указания аргумента. Приведите это в соответствие с семантикой вашего JSON. - Pydantic v1 и v2. Синтаксис и поведение различаются (класс
Configпротивmodel_config,validatorпротивfield_validator); по умолчанию используется версия v2. - Порядок в union важен при десериализации. Pydantic проверяет типы в порядке их объявления; при возможной неоднозначности ставьте наиболее специфичный тип первым (например,
intпередstr).
Часто задаваемые вопросы
Класс данных для простых объектов с нулевым уровнем валидации. Pydantic, при необходимости проверки данных во время выполнения, принудительной преобразования или интеграции с FastAPI. TypedDict, когда требуется только статическая проверка типов (методы mypy и pyright) и не требуется использование экземпляров класса.
Не требуется для Python 3.10+, где объединения | и синтаксис list[str] встроены в язык. Полезно для проектов версий 3.7–3.9 для использования нового синтаксиса с помощью строковых аннотаций по стандарту PEP 563; генератор выдаёт предупреждение, когда это необходимо.
Каждый вложенный объект становится отдельным классом. Корневой класс указывает на них по имени, что позволяет повторно использовать типы данных. Циклические ссылки обнаруживаются и помечаются.
Да, если вы выберете пакет Pydantic: FastAPI напрямую использует модели Pydantic в качестве типов запросов и ответов. Для внутренней обработки данных пакет @dataclass более компактен и удобен в использовании.
Сопутствующие инструменты
Смешивание цветов
Смешайте два HEX-цвета в 2-20 равномерных образцов. Каждый промежуточный цвет показывается как HEX-код в верхнем регистре, включая оба края.
Генератор вымышленных телефонных номеров
Создавайте до 50 вымышленных номеров из официально зарезервированных диапазонов пяти стран.
Генератор конфигурации webpack
Создайте webpack.config.js для webpack 5 по короткой форме: задайте entry, папку вывода и режим, затем включите TypeScript, Babel, загрузчик CSS, HtmlWebpackPlugin и сервер разработки.
Генератор бейджей README
Создавайте бейджи shields.io для файлов README на GitHub: статус сборки, версия, лицензия, число загрузок и покрытие кода. Просмотрите и скопируйте фрагмент Markdown.
Генератор случайных букв
Генерируйте случайные буквы A-Z. Выберите количество, верхний или нижний регистр либо смешанный вариант для игр, заданий и уроков.
Генератор случайных адресов
Создавайте 1–20 похожих на адрес записей для макетов и тестов в трёх упрощённых форматах.
Инструмент доступен на других языках
- JSON do klasy danych w Pythonie [PL]
- JSON till Python-dataklass [SV]
- JSONからPythonデータクラスへの変換 [JA]
- JSON ถึงคลาสข้อมูลใน Python [TH]
- Từ JSON đến lớp dữ liệu Python [VI]
- JSON zu Python Dataclass [DE]
- JSON에서 Python 데이터 클래스로 변환하기 [KO]
- JSON para Dataclass em Python [PT]
- JSON a Dataclass de Python [ES]
- فئة بيانات من JSON إلى بايثون [AR]
- JSON ke Dataclass Python [ID]
- JSON naar Python-dataclass [NL]
- JSON vers Dataclass Python [FR]
- JSON to Python Dataclass [EN]
- JSON in Dataclass Python [IT]
- JSON'dan Python Veri Sınıfına [TR]
- 从 JSON 到 Python 数据类 [ZH]