Перейти к содержимому

Конвертировать JSON в структуры Go — Numio

Генерирует определения структур Go из JSON с помощью порта json-to-go и форматирует их gofmt. Ключи становятся экспортируемыми полями в CamelCase с тегами json:"..."; вложенные объекты становятся встроенными анонимными структурами, а null — any.

JSON

Go

Когда пригодится

  • Написать структуру для json.Unmarshal ответа стороннего REST API.
  • Подготовить типы запросов и ответов для HTTP-обработчика на Go по примерам payload.

Как пользоваться

  1. Вставьте JSON-объект или массив в левый редактор.
  2. Изучите сгенерированную структуру; корневой тип всегда называется AutoGenerated.
  3. Скопируйте её в свой пакет, переименуйте тип и вынесите встроенные структуры в именованные типы, если используете их повторно.

JSON

{
  "id": 42,
  "user_name": "ada",
  "score": 9.5,
  "active": true,
  "deleted_at": null,
  "tags": ["go", "json"],
  "address": { "city": "Tokyo", "zip": "100-0001" }
}

Структура Go

type AutoGenerated struct {
	ID        int      `json:"id"`
	UserName  string   `json:"user_name"`
	Score     float64  `json:"score"`
	Active    bool     `json:"active"`
	DeletedAt any      `json:"deleted_at"`
	Tags      []string `json:"tags"`
	Address   struct {
		City string `json:"city"`
		Zip  string `json:"zip"`
	} `json:"address"`
}

Подробности и ограничения

Генерация выполняется в браузере. Настроек для имени типа, встроенных или именованных структур и тегов нет.

Аббревиатуры пишутся заглавными (id становится ID), snake_case превращается в CamelCase, а исходный ключ сохраняется в теге json.

Целые числа становятся int (int64 для больших значений), дробные — float64. null, пустые и смешанные массивы становятся any или []any.

Если объекты в массиве различаются, ключи, отсутствующие в некоторых из них, получают ,omitempty.

FAQ

Можно ли преобразовать JSON-массив на корневом уровне?

Да. Получается type AutoGenerated []struct{...}, в котором объединены поля всех объектов массива.

Почему моё поле null имеет тип any?

Значение null не несёт информации о типе. Замените any указателем, например *string или *time.Time, чтобы сохранить поддержку nil.

Генерирует ли он именованные вложенные структуры?

Нет. Вложенные объекты — встроенные анонимные структуры. Вынесите их в именованные типы вручную, если на них нужно ссылаться.

Спецификации и справка