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