JSON в Python: генератор моделей dataclass и pydantic

Сгенерировать Python-модель из JSON: dataclass, pydantic v2 и TypedDict. Вложенные объекты, список объектов, Optional и значения по умолчанию. Всё в браузере.

Параметры

Классы по образцам JSON: один или несколько, разделённых строкой из дефисов.

@dataclass со стандартной библиотекой: поле с умолчанием уезжает в конец класса, список объявляется через field(default_factory=list).

Остальные классы называются по ключам JSON

zipCode станет zip_code: для pydantic добавится alias, для dataclass — ключ в data[...].

Дополнительно
Docstring у классаСтрока описания в начале класса: «Модель Address, полей 3»
Методы разбора и сборкиdataclass получает from_dict и to_dict, pydantic — подсказку про model_validate и model_dump. У TypedDict методов нет: это обычный dict

Образцы JSON

Результат

Ожидается ввод: результат появится сразу, как только в поле что-то есть

Зачем генерировать Python-модель из JSON

Объявлять модели по ответу API приходится почти в каждом проекте: документация отстаёт от кода, а иногда её нет вовсе. Руками это долгая работа с предсказуемыми ошибками — пропущенное поле, забытая вложенность, необязательный ключ, объявленный обязательным, из-за которого разбор падает на первом же ответе без этого ключа. Инструмент делает эту работу по самому ответу: вставьте один или несколько образцов JSON и получите готовые классы.

Генератор печатает то, что вы выберете: dataclass с методами разбора и сборки, pydantic v2 с alias и ConfigDict или TypedDict с NotRequired. Вложенные объекты и списки объектов становятся отдельными классами и печатаются в том порядке, в котором компилируются: сначала те, на которые ссылаются. Ключи в camelCase переводятся в snake_case, null даёт Optional, а ключ, которого нет в части образцов, — значение по умолчанию. В отчёте по полям видно, что получило умолчание и сколько образцов его не содержало: это и есть список мест, где модель может разойтись с реальным ответом.

Обратная задача решается тем же инструментом: по объявленным полям собирается пример JSON со всеми ключами — удобно, когда модель уже написана, а тестовые данные нужны сейчас. Стоит помнить о границе: модель описывает то, что было в образцах. Если в ответе появится ключ, которого не было ни в одном образце, dataclass и TypedDict его молча проигнорируют, а pydantic в строгом режиме сообщит о лишнем поле — поэтому образцы стоит брать из разных ответов, включая неполные.

Частые вопросы

Как получить Python-модель из JSON?

Вставьте JSON в поле слева, выберите способ объявления — dataclass, pydantic v2 или TypedDict — и код появится справа сразу, без нажатия кнопок. Вложенные объекты становятся отдельными классами и печатаются выше того класса, который на них ссылается: к моменту объявления имя уже существует. Имя корневого класса задаётся в параметрах, остальные имена собираются из ключей JSON.

Чем отличаются dataclass, pydantic v2 и TypedDict?

dataclass — это только структура: поля и методы from_dict и to_dict, которые инструмент дописывает сам, потому что стандартная библиотека их не даёт. pydantic v2 — это ещё и проверка данных: классы наследуются от BaseModel, разбор идёт через model_validate, сборка через model_dump, а ключ JSON при snake_case задаётся alias в Field и разрешается через ConfigDict(populate_by_name=True). Синтаксис именно v2: в первой версии были parse_obj, dict и вложенный класс Config, они устарели. TypedDict — описание обычного словаря для проверяющих типов: во время работы программы это тот же dict, необязательные ключи помечаются NotRequired, а необязательные значения — Optional.

Как собрать одну модель из нескольких JSON-ответов?

Вставьте несколько образцов подряд, разделив их строкой из трёх и более дефисов — так же, как блоки в Markdown: в JSON такая строка встретиться не может. Ключи объединяются, а в отчёте по полям видно, сколько образцов не содержало ключ. Поля, которые есть везде и не бывают пустыми, остаются обязательными; остальные получают значение по умолчанию, чтобы разбор не падал на неполном ответе. Так же объединяются и вложенные объекты: если во втором ответе у company нет address, поле получит умолчание, а не пропадёт.

Как получаются имена полей в snake_case?

Имя собирается из ключа: isActive становится is_active, zipCode — zip_code. Для pydantic ключ JSON сохраняется в alias, поэтому разбор по исходному ответу работает, а model_dump(by_alias=True) печатает прежние ключи; для dataclass исходный ключ остаётся в методах from_dict и to_dict. Режим «Как в JSON» оставляет имена как есть, но всё равно правит непригодные символы: дефис и ведущая цифра в имени переменной Python недопустимы, поэтому user-name станет user_name, а 2fa — _2fa. Если из-за этого ключи перестают различаться, к имени добавляется номер, и в отчёте видно, какой ключ где оказался. У TypedDict переименования нет вовсе: ключ словаря и есть имя поля, ни alias, ни методов разбора у него не бывает, поэтому там ключи всегда остаются как в JSON.

Что подставляется в поля, которых нет в части образцов?

Скаляр получает нейтральное значение: пустую строку, ноль или False. Список — пустой список, словарь — пустой словарь, а вложенный объект — None, и тогда тип расширяется до Optional. В отчёте у каждого поля стоит статус и то, что именно попало в тело класса, поэтому видно, чем заполнится пропущенный ключ. В TypedDict значений по умолчанию нет по определению: вместо них ключ помечается NotRequired, а разбор в этом случае не падает — ключ просто не найден.

Как из Python-модели получить обратно пример JSON?

Переключите направление на «Python-модель в пример JSON» и вставьте код — инструмент разберёт объявления и соберёт объект со всеми ключами: строка станет «string», число нулём, bool — true, Optional — null, список — массивом из одного элемента. Ключи берутся из alias, если он указан в Field, поэтому пример совпадает с исходным ответом API. Корневой класс выбирается списком, а тип, которого нет в файле, даёт null и строку в отчёте. Классы, ссылающиеся друг на друга, инструмент останавливает на восьмом уровне вложенности.

Чем это отличается от «JSON в TypeScript»?

Языком на выходе, а не входом: образцы JSON у обоих инструментов одни и те же. Здесь они превращаются в Python-модели — dataclass, pydantic v2 или TypedDict, — и есть обратная операция: по готовому классу собирается пример JSON со всеми ключами. Инструмент «JSON в TypeScript» (/tools/developer/json-to-typescript) по тем же образцам печатает объявления TypeScript с camelCase и необязательными полями, но обратного перевода не умеет. Выбирают по языку проекта: Python — эта страница, TypeScript — соседняя.

Данные отправляются на сервер?

Нет. Разбор JSON, разбор кода и печать моделей выполняются в браузере, вставленный JSON или Python никуда не передаётся и не сохраняется. Инструментом можно пользоваться офлайн, а при обновлении страницы поле очистится — нужный код лучше скопировать сразу.