JSON в TypeScript, Go, Python, PHP, Rust
Приватность по умолчанию — работает полностью в вашем браузере
Вывести правильные определения типов из настоящего ответа API — одна из тех задач, что должна занимать пять секунд, но как-то съедает пятнадцать минут. Этот инструмент читает JSON-образец в вашем браузере, обходит структуру и выдаёт идиоматические типы для TypeScript, Go, Python, PHP или Rust — с необязательными полями, распознаванием ISO-дат и корректным разделением целых и дробных чисел.
Как работает инференс
Инструмент проходит JSON-дерево один раз, строя промежуточное представление: примитивы становятся string / int / float / bool / null, массивы выводят тип элемента как объединение членов, а объекты порождают структуру, где тип каждого поля идёт от значения. Если поле есть в одних элементах массива и нет в других, оно помечается необязательным — сгенерированный тип может декодировать частичные данные, не падая. Числа без дробной части выдаются как int64 (Go) / int (Python) / i64 (Rust), с дробной — как float64 / float / f64. Строки в формате ISO 8601 (`2024-03-15T10:30:00Z`) становятся Date / time.Time / datetime / DateTimeInterface / chrono::DateTime.
Стиль вывода по языкам
Каждый эмиттер следует конвенциям целевого языка. TypeScript: экспортируемые интерфейсы с синтаксисом `?:`. Go: структуры с тегами `json:`, необязательные как указатели с `omitempty`. Python: `@dataclass`, обязательные поля сначала, `Optional[T] = None` в конце (правило порядка dataclass). PHP: финальные классы со строгой типизацией и подсказками `@var list<T>` для типизированных массивов. Rust: структуры с `#[derive(Serialize, Deserialize)]`, `Option<T>` для null-полей и `#[serde(rename)]`, когда имя в snake_case отличается от JSON-ключа.
Когда использовать (и когда нет)
Генератор решает первые 80% работы: получить рабочее определение типов из payload за секунды. Он не заменяет схему, написанную вручную, когда нужны точные ограничения (regex на строки, min/max на числа, размеченные объединения). Для таких случаев используйте вывод как стартовую точку и уточняйте типы. Распознавание необязательных полей — эвристика, опирающаяся на то, что есть в образце, поэтому пропускайте несколько разных образцов, если можете.
Часто задаваемые вопросы
- Выходит ли JSON, который я вставляю, за пределы браузера?
- Нет. Парсер, инференс типов и эмиссия кода — всё работает в JavaScript внутри вкладки. Откройте панель Network во время генерации — увидите ноль исходящих запросов. Безопасно для продакшен-payload с реальными токенами и PII.
- Почему поле помечено как необязательное, хотя у него всегда есть значение?
- Флаг необязательности срабатывает, когда массив содержит объекты с этим полем и объекты без. Если вы вставляете один объект, ничто не становится необязательным. Массив одинаковых объектов — тоже нет. Флаг включается только когда структура внутри массива различается.
- Как различаются целое и дробное?
- В JSON один числовой тип. Инструмент проверяет каждое значение и выдаёт int, когда нет дробной части (`42`, `1000`), и float, когда есть (`3.14`, `99.0`). Если массив смешивает, тип расширяется до float, чтобы избежать потерь.
- Распознаёт ли он ISO-даты?
- Да. Строки, соответствующие `YYYY-MM-DD` или `YYYY-MM-DDTHH:MM:SS[.sss][Z|±HH:MM]`, выдаются как нативный тип даты/времени языка (Date в TS, time.Time в Go, datetime в Python, DateTimeInterface в PHP, chrono::DateTime в Rust). Другие форматы остаются строками.
- Нужно ли что-то устанавливать, чтобы использовать сгенерированный код?
- TypeScript: ничего, чистый. Go: только стандартная библиотека (time.Time при ISO-датах). Python: стандартный модуль dataclasses. PHP: нативные типы. Rust: нужен serde + chrono, если есть ISO-даты. Заголовок/импорты пишутся в выводе, где это уместно.
- Можно ли сгенерировать типы для массива объектов в корне?
- Да. Если корневое значение — массив объектов, инструмент выдаёт структуру для элемента и алиас типа верхнего уровня для массива. Например, JSON `[{...}, {...}]` с именем `Users` даёт интерфейс `User` плюс `type Users = User[];` в TypeScript или `pub type Users = Vec<User>;` в Rust.