JSON в структуру данных

Далее

Вставьте пример JSON-данных и получите определения структур Go, которые можно чётко обработать с помощью encoding/json. Поле экспортируются (в формате CamelCase), помечаются исходными ключами из JSON, превращаются в указатели в случаях, когда значение может быть null, а вложенные объекты получают отдельные дефиниции структур с собственными названиями.

Как преобразовать JSON в структуру языка Go

  1. 1

    Вставьте JSON

    Одна проба достаточна; использование нескольких проб улучшает процесс выводов в случае наличия возможных значений.

  2. 2

    Выберите имя

    Для экспортируемых полей используется конвенция PascalCase. Выберите стиль сокращений (`URL` против `Url`, `ID` против `Id`).

  3. 3

    Выберите опциональную стратегию

    Используйте указатели для полей с возможностью отсутствия значений (наиболее стандартный подход) или теги `omitempty`.

  4. 4

    Копируйте структуры

    Одна корневая структура вместе с вложёнными структурами. Вставьте её в файл `.go` и выберите вариант `go build`.

Пример вывода

Для:

{ "first_name": "Alice", "age": 30, "email": null, "tags": ["admin"] }

Результат:

type User struct {
    FirstName string   `json:"first_name"`
    Age       int      `json:"age"`
    Email     *string  `json:"email"`
    Tags      []string `json:"tags"`
}

Маппинг типов

Значение в формате JSON Тип в Go
строка string
целое число int или int64
номер (в десятичной системе) float64
логическое значение bool
null (при наличии не-нулевого брата или сестры) *T (указатель)
массив []T
объект Названная структура
смешанный массив []interface{}

Идиомы именования, которым следует генератор

  • Инициалы пишутся заглавными буквами: idID, urlURL, api_keyAPIKey. Это соответствует рекомендуемому стилю языка Go (а также правилам go vet и staticcheck).
  • Поле в формате snake_case в JSON преобразуется в PascalCase: first_nameFirstName.
  • Однословные акронимы сохраняются: IP остаётся IP, HTTP остаётся HTTP.
  • Тег JSON: json:"first_name" сохраняет исходный ключ, что обеспечивает чистое кодирование в обе стороны.

Необязательные поля: указатель или omitempty?

Стратегия Применять при
Указатель (*T) Необходимо различать значение «отсутствует» и значение «нулевое»
omitempty При маршалинге нужно пропускать только нулевые значения; при демаршалинге для отсутствующих значений сохраняется 0
Ни то, ни другое Поле всегда присутствует, а нулевые значения имеют смысл

По умолчанию генератор использует указатель + omitempty для значений, которые интерпретируются как нулевые; настройка осуществляется в соответствии с вашими требованиями к семантике данных.

Типичные ошибки

  • Использование int, когда целое число из JSON превышает MaxInt32 на 32-битной платформе. Для заведомо больших значений используйте int64.
  • Повторное кодирование с потерей порядка ключей. encoding/json выдаёт ключи в порядке объявления полей, а не в исходном порядке JSON. Если нужен канонический вывод, отсортируйте вручную.
  • Массивы смешанной формы. []interface{} теряет типобезопасность. Вместо этого рассмотрите типы-объединения с полем-дискриминатором type.
  • Забытый omitempty у необязательных полей. Без него необязательные поля сериализуются как "foo": null, а не опускаются.

Часто задаваемые вопросы

Используйте указатели, когда нужно различать случаи «поле отсутствует» и «поле равно нулю». Используйте omitempty, когда нулевое значение не является допустимым бизнес-значением ("", 0 и false всегда означают «пропустить это»). Многие команды выбирают один из вариантов и последовательно применяют его во всей базе кода.

Каждый вложенный объект превращается в отдельную декларацию структуры с именем (например, UserAddress). Типы внедряются только в том случае, если вложенная структура небольшая и используется всего один раз; в остальных случаях используются чистые, многократно повторяемые типы.

Да. id становится ID, url, URL, а api_key, APIKey. Именно этого ожидает стандарт go vet, и это рекомендовано большинством руководств по стилю программирования на языке Go.

Генератор выдаёт простые структуры с стандартными тегами json:. Для пользовательских реализаций UnmarshalJSON (например, для дат в нестандартных форматах) их необходимо добавить вручную после генерации.

Сопутствующие инструменты

Справочная таблица ASCII

Полная таблица ASCII от 0 до 127 с десятичным, шестнадцатеричным, восьмеричным и двоичным представлением, а также записью числовых ссылок HTML, включая NUL, LF и DEL.

Справочник сочетаний клавиш

Ищите документированные сочетания по умолчанию для VS Code, Chrome и Bash с GNU Readline в macOS, Windows и Linux.

Справочник символов HTML

Справочник HTML-сущностей с поиском, их именованными и числовыми кодами, а также копированием специальных символов и знаков одним кликом.

Шпаргалка по Markdown

Практический справочник Markdown с настоящим предпросмотром и готовыми для копирования примерами заголовков, списков, таблиц, кода, ссылок, изображений и синтаксиса GFM.

Счетчик FPS

Измерьте FPS браузера через requestAnimationFrame: сглаживание, минимальная и максимальная частота кадров, порог предупреждения и график по желанию. Работает локально, без загрузок и API.

Шпаргалка по регулярным выражениям

Поисковый справочник регулярных выражений для JavaScript, PCRE2/PHP, Python re и .NET. Сравнивайте токены, синтаксис движков, якоря, группы, проверки и флаги.

Инструмент доступен на других языках