Конвертер JSON в Python
Вставьте ответ API или конфигурацию в JSON и получите для них описания типов на Python. Выберите @dataclass для объектов, которые вы создаёте в коде, или TypedDict для типизации обычных словарей из json.loads. Вложенные объекты становятся отдельными классами, а ключи, которых нет в части элементов, — необязательными.
Работает в браузере: всё, что вы вводите, никуда не отправляется.
Как пользоваться
- Вставьте пример JSON. Берите реалистичный: чем больше элементов в массиве, тем точнее определяются необязательные ключи.
- Выберите @dataclass или TypedDict.
- Скопируйте код. Классы вложенных объектов идут первыми, поэтому файл выполняется сверху вниз.
Как это работает
Пример разбирается в структуру: каждый ключ каждого объекта со всеми встреченными в нём типами. Все объекты одного массива объединяются в один класс.
- str, int, float, bool, list[…] и вложенные классы пишутся напрямую; null добавляет Optional[…].
- Имена классов берутся из ключа: в «orders» лежит список Order, а «billing_address» становится BillingAddress. Верхний уровень — Root.
- Импортируется только то, что используется: dataclass, Any, Optional, TypedDict, NotRequired.
Пример
{"items":[{"sku":"A","note":null,"qty":1},{"sku":"B","note":"x"}]} с @dataclass даёт:
from dataclasses import dataclass
from typing import Optional
@dataclass
class Item:
sku: str
note: Optional[str]
qty: Optional[int] = None
@dataclass
class Root:
items: list[Item]
«note» иногда равен null, поэтому он Optional[str]. «qty» нет во втором элементе, поэтому он получает значение по умолчанию и переносится в конец.
Советы
- Проверьте типы полей, где пример оказался «удачным»: цена 10 в примере станет int, хотя в других данных может быть 9.99.
- После генерации переименуйте классы под свою предметную область.
- Для JSON Schema или TypeScript воспользуйтесь генератором JSON Schema или конвертером JSON в TypeScript.
Частые вопросы
Как типы JSON сопоставляются с Python?
Строки становятся str, true и false — bool, целые числа — int, остальные числа — float (смесь тех и других — float). Массивы становятся list[...], объекты — классами, а null делает тип Optional[...]. Место, где встречаются значения разных видов, получает тип Any.
Как обрабатываются необязательные ключи?
Если в массиве несколько объектов, ключ, которого нет в части из них, считается необязательным. В dataclass он становится Optional[...] = None и переносится после обязательных полей, как того требуют dataclass; в TypedDict он оборачивается в NotRequired[...].
Что происходит с ключами, которые не могут быть именами в Python?
В dataclass ключи вроде first-name, class или 2fa становятся first_name, class_ и f_2fa, а исходный ключ JSON пишется в комментарии. В TypedDict функциональный синтаксис TypedDict('Name', {...}) сохраняет ключи как есть.
Какая версия Python нужна?
Код использует list[...] и Optional из typing — это работает в Python 3.9 и новее. Для NotRequired, которым помечаются необязательные ключи TypedDict, нужен Python 3.11 или typing_extensions.
Разбирает ли dataclass вложенный JSON сам?
Нет. Root(**data) заполняет только верхний уровень, вложенные словари остаются словарями. Преобразуйте вложенные части сами или используйте библиотеку вроде pydantic или dacite.