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{}

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

  • Инициалы пишутся заглавными буквами: id → ID, url → URL, api_key → APIKey. Это соответствует рекомендуемому стилю языка Go (а также правилам go vet и staticcheck).
  • Поле в формате snake_case в JSON преобразуется в PascalCase: first_name → FirstName.
  • Однословные акронимы сохраняются: 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 всегда означают «пропустить это»). Многие команды выбирают один из вариантов и последовательно применяют его во всей базе кода.

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

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

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

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

Генератор вымышленных телефонных номеров

Создавайте до 50 вымышленных номеров из официально зарезервированных диапазонов пяти стран.

Генератор конфигурации webpack

Создайте webpack.config.js для webpack 5 под чистый JavaScript, React или Vue: TypeScript, Babel, CSS или Sass, изображения, HtmlWebpackPlugin, dev-сервер и команда npm install.

Валидатор XSD

Проверьте XML-документ в соответствии с схемой XSD и выявите несоответствия между элементами и их типами, указав точные номера строк.

Генератор случайных букв

Генерируйте случайные буквы A-Z. Выберите количество, верхний или нижний регистр либо смешанный вариант для игр, заданий и уроков.

Генератор случайных адресов

Создавайте 1–20 похожих на адрес записей для макетов и тестов в трёх упрощённых форматах.

Конвертер размера файлов

Преобразуйте значения между байтами, КБ, МБ, ГБ, ТБ и двоичными единицами IEC (KiB, MiB, GiB, TiB), свободно сочетая десятичные и двоичные единицы.

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