Генератор кода из JSON
JSONСоздавайте типы TypeScript, Java, Go и C# из JSON с выводом вложенных объектов и массивов.
Удалённые URL не запрашиваются; вставьте JSON напрямую.
На этой странице
Что такое генератор кода из JSON?#
Генератор кода из JSON читает образец JSON-документа, выясняет форму данных — какие поля строки, какие числа, какие вложенные объекты, какие массивы чего — и пишет типы сущностей, которыми реальная программа стала бы держать эти данные. Вместо того чтобы вручную набивать интерфейс TypeScript, класс Java, структуру Go или класс C# под ответ API, вы вставляете один пример ответа и получаете готовые типы, которые можно сразу перенести в проект.
Под капотом он обходит разобранное значение и выводит схему. Вложенные объекты становятся собственными именованными типами; тип элемента массива — это объединение форм всех элементов (поэтому список объектов, не у всех с одинаковыми ключами, всё равно даёт один тип с объединением полей). Имена полей, недопустимые как идентификаторы, — ключи с дефисом вроде first-name или начинающиеся с цифры — превращаются в корректный идентификатор, а исходный ключ сохраняется как аннотация сериализации, поэтому обратный путь тоже работает.
На выходе — исходный код в виде простого текста, без runtime-зависимости от этой страницы. Скопируйте его, вставьте в кодовую базу, поправьте имена типов — и у вас отправная точка: не готовая модель, но скучный каркас уже написан за вас.
Как пользоваться#
- Выберите язык в выпадающем списке Язык: TypeScript, Java, Go или C#.
- Задайте Имя корня (по умолчанию
Root). Оно станет именем самого внешнего типа — напримерUser,Order,Response. - Вставьте JSON в левую панель. Сгенерированный код появится в реальном времени справа; строка состояния сообщит об ошибках (некорректный JSON, пустой ввод).
- Нажмите Копировать, чтобы забрать код в буфер.
- Пример загружает вложенный объект с подобъектом и массивом; Очистить сбрасывает обе панели.
Ключевые возможности#
- Четыре целевых языка. Интерфейсы TypeScript, классы Java, структуры Go и классы C# — один ввод, четыре вывода, переключаются выпадающим списком.
- Вывод схемы, а не буквальная расстановка типов. Вложенные объекты становятся именованными типами; массивы объектов дают именованный тип элемента, а не непрозрачный список
any. - Объединение разнородных массивов. Когда элементы массива имеют разные поля, выведенный тип — это объединение, что полезно для «грязных» реальных ответов, где не у каждого элемента есть каждый ключ.
- Идентификаторы корректны, ключи верны. Ключи, недопустимые как идентификаторы, очищаются, а исходный ключ сохраняется как аннотация сериализации (
@JsonProperty, тег Gojson:,JsonPropertyName), поэтому исходный JSON всё равно правильно десериализуется. - В реальном времени и локально. Генерация идёт в вашем браузере по мере ввода или переключения опций; данные не покидают страницу.
Разбор примера#
Загрузите Пример с Языком TypeScript и Именем корня Root — вводом будет:
{
"id": 1,
"name": "Ada",
"active": true,
"address": { "city": "London", "zip": "NW1" },
"tags": ["math", "logic"]
}
Генератор выдаёт два интерфейса — корневой и именованный тип Address для вложенного объекта:
export interface Root {
id: number;
name: string;
active: boolean;
address: Address;
tags: Array<string>;
}
export interface Address {
city: string;
zip: string;
}
Переключите язык на Go, и тот же ввод становится структурами с тегами json:, сохраняющими исходные ключи:
package model
type Root struct {
Id float64 `json:"id"`
Name string `json:"name"`
Active bool `json:"active"`
Address Address `json:"address"`
Tags []string `json:"tags"`
}
type Address struct {
City string `json:"city"`
Zip string `json:"zip"`
}
Обратите внимание, как id — JSON-число — попадает в number в TypeScript и float64 в Go: генератор не угадывает целое против плавающей точки, потому что сам JSON их не различает.
FAQ#
Почему моё целочисленное поле типизировано как float64 / Double / double?#
Потому что у JSON один числовой тип и нет способа отличить 5 от 5.0. Генератор отображает каждое JSON-число в общий числовой тип целевого языка — number в TypeScript, Double в Java, float64 в Go, double в C# — поэтому тип всегда достаточно широк, чтобы вместить любое возможное значение. Если вы знаете, что поле всегда целое, сузьте его до int / Long / int64 вручную после.
Что происходит, когда объекты моего массива имеют не все одинаковые поля?#
Их формы объединяются. Массив вроде [{ "a": 1 }, { "a": 2, "b": "x" }] даёт один тип элемента с обоими полями a и b, поэтому единственный тип покрывает каждый элемент. Если два элемента не согласны по типу поля несовместимым образом (скажем, тут число, а там строка), это поле деградирует до any / Object, а не выбирает одну сторону и не ошибается относительно другой.
Поле в моём JSON содержит дефис, как first-name. Это сломается?#
Нет. Генератор превращает first-name в корректный идентификатор (firstName) для имени поля и выдаёт аннотацию сериализации, фиксирующую исходный ключ, — @JsonProperty("first-name") в Java, тег json:"first-name" в Go, [JsonPropertyName("first-name")] в C# и ключ в кавычках "first-name" в TypeScript. Поэтому сгенерированный код десериализует исходный JSON без изменений.
Что инструмент делает со значением null?#
Поле со значением null трактуется как неизвестный тип. В TypeScript оно становится опциональным any (field?: any;); в Java и C# — Object / object; в Go — interface{}. Это намеренный сигнал: null ничего не говорит о том, что хранит поле, когда оно присутствует, поэтому генератор отказывается угадывать и оставляет его вам.