Что делает инструмент
Конвертер JSON в Go читает пример JSON и пишет определения структур Go с тегами json, готовые для encoding/json. Вставьте ответ API, который вы вызываете, и получите типы, которые сразу можно передать в json.Unmarshal, не выписывая вручную каждое поле и тег.
Конвертер проверяет каждое значение в примере. Вложенные объекты становятся отдельными структурами, все элементы массива объединяются в один тип элемента, а поля, которых нет в некоторых элементах или которые иногда равны null, определяются как необязательные. Вывод выровнен так, как это сделал бы gofmt.
Как пользоваться
- Вставьте JSON в поле ввода, загрузите файл
.jsonили нажмите Пример. - Задайте имя корневого типа и выберите, как записывать вложенные объекты, какие поля получают
omitemptyи использовать ли указатели для полей, допускающих null. - Скопируйте код Go или скачайте его как файл
.goи добавьте строкуpackage.
Некорректный JSON отмечается строкой и столбцом ошибки.
Пример
Этот JSON:
{ "id": 7, "user_name": "ada", "tags": ["admin"], "profile": { "avatar_url": "https://example.com/a.png" } }
превращается в такие структуры:
type Root struct {
ID int `json:"id"`
UserName string `json:"user_name"`
Tags []string `json:"tags"`
Profile Profile `json:"profile"`
}
type Profile struct {
AvatarURL string `json:"avatar_url"`
}
Советы
- Один пример показывает только то, что в нём есть. Если значение может быть числом или строкой, включите оба варианта или поместите несколько примеров в массив, чтобы они объединились.
- Метки времени приходят строками. Замените тип на
time.Timeсами, если формат — RFC 3339. - Объекты с полностью одинаковыми полями используют одну структуру, поэтому вывод остаётся коротким, когда одна и та же форма встречается в нескольких местах.
- Пишете и на TypeScript? Генератор JSON в TypeScript использует тот же вывод типов для интерфейсов.
Частые вопросы
› Как выбираются имена полей?
Каждый ключ JSON превращается в экспортируемое имя Go в PascalCase, а распространённые аббревиатуры пишутся заглавными, как ожидает golint, поэтому user_id становится UserID, а avatar_url — AvatarURL. Исходный ключ сохраняется в теге json, так что encoding/json точно сопоставляет поля.
› Какие типы Go используются?
Строки становятся string, целые числа — int (или int64, если значение не помещается в 32 бита), дробные — float64, логические значения — bool. Массивы становятся срезами, пустые объекты — map[string]any, а значения, которые бывают только null или смешивают несколько видов, — any.
› Чем отличаются именованные и встроенные структуры?
Именованный режим записывает каждый вложенный объект как отдельный тип, например Address или Order, что упрощает повторное использование и тестирование. Встроенный режим помещает анонимные типы struct прямо в родителя и держит всё в одном объявлении, как делают многие быстрые конвертеры.
› Когда добавляется omitempty?
По умолчанию только к необязательным полям, то есть к тем, что отсутствуют в некоторых объектах массива или иногда равны null. Можно также добавить его ко всем полям или ни к одному. Включите указатели, чтобы отличать отсутствующее значение или null от нулевого.
› Загружается ли мой JSON?
Нет. Структуры генерируются в браузере, и ничего не отправляется на сервер.