JSON в структуру данных
Вставьте пример JSON-данных и получите определения структур Go, которые можно чётко обработать с помощью encoding/json. Поле экспортируются (в формате CamelCase), помечаются исходными ключами из JSON, превращаются в указатели в случаях, когда значение может быть null, а вложенные объекты получают отдельные дефиниции структур с собственными названиями.
Как преобразовать JSON в структуру языка Go
-
1
Вставьте JSON
Одна проба достаточна; использование нескольких проб улучшает процесс выводов в случае наличия возможных значений.
-
2
Выберите имя
Для экспортируемых полей используется конвенция PascalCase. Выберите стиль сокращений (`URL` против `Url`, `ID` против `Id`).
-
3
Выберите опциональную стратегию
Используйте указатели для полей с возможностью отсутствия значений (наиболее стандартный подход) или теги `omitempty`.
-
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), свободно сочетая десятичные и двоичные единицы.
Инструмент доступен на других языках
- JSON zu Go Struct [DE]
- JSON을 Go 구조체로 변환 [KO]
- JSON till Go-struktur [SV]
- JSON vers Go Struct [FR]
- JSON naar Go-structuur [NL]
- JSON ke Struktur Go [ID]
- JSON para Estrutura Go [PT]
- JSON na strukturę Go [PL]
- JSON เป็นโครงสร้างข้อมูล Go [TH]
- JSON thành cấu trúc [VI]
- JSON a Estructura Go [ES]
- JSON→Go構造体 [JA]
- JSON إلى بنية Go [AR]
- JSON to Go Struct [EN]
- JSON in Struttura Go [IT]
- JSON'dan Go Yapısına [TR]
- JSON 至Go结构 [ZH]