Перейти до вмісту
100% локально

JSON у Python dataclass

Перетворіть приклад JSON у типізовані класи Python — dataclass, Pydantic, TypedDict або NamedTuple.

Введення
Вихід

JSON у Python dataclass

Вставте об'єкт JSON або масив, і цей інструмент автоматично визначить тип для кожного поля та згенерує відповідні класи Python з повними анотаціями типів. Виберіть стиль виводу, який відповідає вашій кодовій базі: простий @dataclass, Pydantic BaseModel для валідації запитів та відповідей, TypedDict для анотування існуючого словникового коду, або NamedTuple для легких незмінюваних записів. Вкладені об'єкти стають власними класами, визначеними в правильному порядку, тому файл відразу працює; об'єкти з однаковою формою — як кожен елемент у масиві записів — повторно використовують один клас замість створення дублікату для кожного.

Опції керують тим, консервативний чи сучасний сгенерований код. Опція «Optional для нульових полів» перетворює поле, яке було null у вашому зразку, на тип Optional (або Any) замість безкорисного голого None; «Додати значення за замовчуванням» доповнює це за допомогою «= None», щоб поле можна було пропустити при створенні екземпляра, а обов'язкові поля автоматично переупорядковуються перед полями зі значеннями за замовчуванням, де це вимагає синтаксис Python. Опція «Псевдонім для неправильних імен полів» обробляє ключі JSON, які не є дійсними ідентифікаторами Python — ключ з дефісом, як-от «first-name», стає атрибутом first_name, пов'язаним назад з вихідним ключем через метадані поля в dataclass або Field(alias=...) у Pydantic, щоб серіалізація працювала правильно. Опція «Використовувати list[T] замість List[T]» перемикається між сучасними вбудованими узагальненнями PEP 585 та старішим стилем typing.List, який деякі проекти все ще потребують, а перемикач анотацій майбутнього змінює Optional[X]/Union[X, Y] на новіший синтаксис X | None / X | Y в усьому коді.

Виведення типів розрізняє рядки, цілі числа, числа з плаваючою точкою та логічні значення, об'єднує змішаний вміст масиву в один тип Union і надає масиву кореневих об'єктів розумне ім'я класу RootItem з псевдонімом Root = list[RootItem] нижче. Оскільки число JSON не несе власний маркер int/float, число без десяткової точки завжди читається як int — немає способу відновити передбачуване «36.0» після аналізу.

Усе виконується локально у вашому браузері: JSON, який ви вставляєте, часто справжня відповідь API або запис з бази даних, аналізується та перетворюється без відправлення куди-либудь. Скопіюйте згенерований Python, завантажте його як файл .txt або відправте результат назад на вхід, щоб продовжити його удосконалення.

FAQ

Які стилі виводу підтримуються?
Чотири: @dataclass (стиль стандартної бібліотеки), Pydantic BaseModel (для валідації та аналізу JSON), TypedDict (анотації типів на простому словнику без класу runtime) та NamedTuple (незмінювані записи, подібні до кортежів).
Як обробляються вкладені об'єкти та масиви об'єктів?
Кожна окремішна форма об'єкту стає власним класом, названим за полем, яке його містить, і визначена до класу, який на нього посилається. Об'єкти з однаковим набором полів та типів повторно використовують один клас замість дублювання — масив записів однакової форми генерує один клас елемента.
Що відбувається з ключами JSON, які не є дійсними ідентифікаторами Python?
Вони очищуються до дійсного імені атрибуту (наприклад, «first-name» → first_name). Коли опція «Псевдонім для неправильних імен полів» ввімкнена, вихідний ключ зберігається через вбудований псевдонім (метадані поля в dataclass, Field(alias=...) у Pydantic) або завершуючий коментар для TypedDict та NamedTuple, які не мають вбудованого механізму псевдоніма.
Може він надійно розрізняти int та float?
Він класифікує кожне число за наявністю дробової частини у вашому зразку, але сам JSON не розрізняє int та float для цілих чисел — значення, надіслане як 36.0, невідрізниме від 36 після аналізу, тому воно читається як int.
Мій JSON завантажується кудись?
Ні. Аналіз та генерація коду виконуються повністю у вашому браузері — JSON, який ви вставляєте, та Python, який він виробляє, ніколи не залишають ваш пристрій.