logo
GeekFormat

JSON в Go

Вставьте JSON слева, и определения типов struct Go, готовые к прямому использованию в проектах Go, автоматически сгенерируются справа. Чисто локальная обработка в браузере, не требует регистрации или загрузки.

Похожие

О JSON в Go: Преобразование JSON в строготипизированную struct Go

JSON в Go — это процесс автоматического преобразования данных в формате JSON в определения типов struct языка Go. JSON — самый распространенный формат обмена данными в REST API, конфигурационных файлах, очередях сообщений и журналах, в то время как Go — строготипизированный язык; во время разработки динамическая структура JSON часто должна сопоставляться со struct перед десериализацией с encoding/json. Написание struct вручную, особенно вложенных объектов, легко приводит к пропущенным полям или неправильным типам; этот инструмент направлен на автоматизацию повторяющейся работы.

Struct в Go — это составной тип данных, объявляемый как `type Name struct { ... }`. Каждое поле состоит из имени и типа; имена полей должны начинаться с заглавной буквы, чтобы быть доступными из других пакетов, так называемые «экспортируемые идентификаторы». Инструмент автоматически преобразует имена полей JSON в экспортируемые имена полей в PascalCase, например `user_name` сопоставляется с `UserName`, с сохранением исходного ключа в json-теге.

Основное преобразование этого инструмента выполняется встроенным в браузер Web Worker jsonFormat, который вызывает рендерер Go quicktype-core с опциями `just-types` и `no-comments`. Весь процесс не зависит от серверных служб: вводимый JSON парсится локально, типы выводятся, код Go генерируется, наконец, представляется в правом редакторе.

Вывод типов следует обычному сопоставлению JSON с Go: строки сопоставляются с `string`, булевы значения с `bool`, целые числа с `int64`, числа с плавающей точкой с `float64`, массивы со срезами `[]T`, объекты с независимыми структурами, `null` с `interface{}`. Вложенные объекты обрабатываются рекурсивно, сохраняя четкую иерархию.

По сравнению с ручным написанием, сгенерированный инструментом код — это «работающий первый черновик». Разработчикам обычно нужно только тонко настроить имя корневого типа, имя пакета, точность типов полей (например int64 в int) и использовать ли типы указателей, прежде чем размещать в реальных проектах Go. В сочетании с копированием одним кликом и загрузкой model.go повторяющаяся работа на этапах интеграции и моделирования значительно сокращается.

Варианты использования

  • Разработка бэкенда на Go преобразует JSON ответа REST API в struct, напрямую связывает с параметрами обработчика Gin/Echo/Fiber через json.Unmarshal
  • При интеграции фронтенда и бэкенда берет пример JSON ответа из Postman, быстро генерирует модель Go для сокращения ручного ввода полей
  • При интеграции сторонних Webhook-обратных вызовов преобразует полезную нагрузку JSON в struct Go для удобного доступа и валидации на уровне полей
  • Преобразует конфигурационные файлы JSON из Viper/Consul/Nacos в типы Go, заменяя слаботипизированный доступ map[string]interface{}
  • Команды микросервисов унифицируют структуру запросов/ответов для интерфейсов gRPC/HTTP, преобразуют пример JSON в общие типы Go
  • Инженеры по тестированию преобразуют JSON fixture в struct Go, используют с testify для тестирования на основе утверждений
  • DevOps анализируют строки журналов JSON, собранные ELK/Fluentd, генерируют struct для структурированного анализа программами на Go
  • После того как краулеры собрали данные JSON, преобразуют в struct Go, работают с gorm/gen или ent для генерации моделей баз данных
  • Данные телеметрии JSON, сообщаемые IoT-устройствами, преобразуются в struct Go, десериализация и фильтрация в программах граничных шлюзов
  • Преобразует сообщения JSON, потребляемые из Kafka/NATS/RabbitMQ, в типы Go для реализации потребителей, управляемых событиями
  • Разработчики SDK преобразуют пример JSON ответа сервера в struct Go, записывают в пакет types клиентской библиотеки для справки пользователей
  • Преобразует пример JSON из документации Swagger/OpenAPI в struct Go как примеры кода документации интерфейса
  • Студенты или преподаватели преобразуют пример JSON в struct во время курсов Go, демонстрируют систему типов Go и использование json-тегов
  • Скрипты миграции данных преобразуют строки JSON, экспортированные из MySQL/PostgreSQL, в struct Go для сопоставления полей и валидации типов
  • JSON конфигурации CI/CD преобразуется в struct Go, удобно для строготипизированного чтения конфигурации в инструментах конвейера, написанных на Go
  • Старые проекты рефакторят динамический код чтения JSON на основе map в строготипизированный доступ на основе struct

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

  1. Вставьте содержимое JSON в левом редакторе, или перетащите файлы .json/.txt, или нажмите «Пример» для загрузки встроенных данных.
  2. Подождите около 400мс, инструмент автоматически преобразует и отобразит сгенерированный код struct Go справа.
  3. Если в JSON есть ошибки, нажмите кнопку «Исправить JSON» для автоматического исправления распространенных ошибок форматирования, затем продолжите генерацию.
  4. Проверьте правый вывод, нажмите «Копировать» для вставки в проект Go, или нажмите «Загрузить» для сохранения как файл model.go.

Функции

  • Локальная генерация struct Go в браузере: Парсинг JSON и генерация кода Go выполняются в браузере, исходные данные не загружаются на сервер
  • Автопреобразование с дебаунсом 400мс: Не нужно вручную нажимать после вставки или изменения, копируемый код Go выводится в реальном времени справа
  • Умный вывод типов: строки отображаются в string, булевы значения в bool, целые числа в int64, числа с плавающей точкой в float64, массивы в срезы, объекты в структуры
  • Автоматическое раскрытие вложенных объектов: Рекурсивно генерирует независимые типы struct, сохраняя четкую иерархию JSON
  • Автогенерация json-тегов: Поля снабжаются тегами `json:"исходное_имя_поля"`, готовыми к использованию с encoding/json
  • Исправление ошибок JSON одним кликом: Автоматически обрабатывает конечные запятые, одинарные кавычки, пропущенные кавычки и другие распространенные ошибки форматирования, продолжает генерацию после исправления
  • Поддержка ввода вставкой/загрузкой/примером: Перетаскивание для загрузки файлов .json/.txt или загрузка встроенных примеров
  • Копирование и загрузка одним кликом: Копирование всего кода Go в буфер обмена или загрузка как файл model.go прямо в проект
  • История ввода localStorage: Автоматически сохраняет последние вводы, быстрое восстановление после обновления или случайного закрытия страницы
  • Адаптивный редактор с разделенным экраном: Регулируемая ширина левой/правой панели, удобный просмотр ввода/вывода на десктопе и мобильных устройствах

Примеры кода

Десериализация JSON с сгенерированной struct

go

После копирования сгенерированной struct в проект напрямую десериализуйте ответ API с помощью encoding/json.

package main

import (
    "encoding/json"
    "fmt"
)

// 以下代码由 GeekFormat JSON 转 Go 工具生成
type User struct {
    ID      int64    `json:"id"`
    Name    string   `json:"name"`
    Tags    []string `json:"tags"`
    Address Address  `json:"address"`
}

type Address struct {
    City string `json:"city"`
}

func main() {
    data := []byte(`{
        "id": 1,
        "name": "Alice",
        "tags": ["admin", "dev"],
        "address": {"city": "Beijing"}
    }`)

    var u User
    if err := json.Unmarshal(data, &u); err != nil {
        panic(err)
    }

    fmt.Println(u.Name, u.Address.City)
}

Обработка JSON с потенциально отсутствующими полями

go

Если некоторые поля API могут не существовать, измените соответствующие поля на типы указателей или используйте с тегом omitempty.

package main

import "encoding/json"

// 手动将字段改为指针,缺失时值为 nil
type User struct {
    ID      *int64  `json:"id,omitempty"`
    Name    *string `json:"name,omitempty"`
    Email   *string `json:"email,omitempty"`
}

func main() {
    data := []byte(`{"id": 1, "name": "Bob"}`)
    var u User
    json.Unmarshal(data, &u)
    if u.Email == nil {
        println("Email 字段缺失")
    }
}

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

Как преобразовать JSON в struct Go?

Вставьте содержимое JSON в левое поле ввода, инструмент автоматически преобразует за 400мс и отобразит сгенерированную struct Go справа. Вы также можете перетащить файлы .json/.txt или нажать «Пример» для загрузки встроенных данных. После преобразования скопируйте или загрузите файл model.go одним кликом.

Содержит ли сгенерированный код Go json-теги?

Да. Инструмент генерирует код Go на основе quicktype-core, и по умолчанию каждое поле struct снабжается тегом `json:"исходное_имя_поля"`, удобным для прямой сериализации и десериализации с помощью Unmarshal/Marshal из encoding/json.

Будут ли массивы JSON преобразованы в срезы Go?

Да. Массивы JSON генерируют соответствующие типы срезов на основе типов элементов, например `["a","b"]` генерирует `[]string`, `[1,2,3]` генерирует `[]int64`, `[{...},{...}]` генерирует пользовательские типы вроде `[]UserItem`.

Будут ли вложенные объекты генерировать несколько структур?

Да. Каждый вложенный объект рекурсивно генерирует независимый тип struct, именуемый в PascalCase. Например, объект `address` генерирует struct `Address`, на которую ссылается основная struct через поле `Address Address`.

Какой тип генерируют значения null?

Значения null в JSON обычно выводятся как `interface{}`, что является безопасным резервным типом. Если вы знаете фактический тип поля, вы можете добавить пример значения в JSON, перегенерировать, а затем вручную настроить конкретный тип.

Могу ли я настроить имя корневой struct?

Да. Инструмент по умолчанию использует имя корневого типа (например User); после изменения имени корневого типа в настройках все связанные имена подтипов синхронно обновляются, имя загружаемого файла также изменится соответствующим образом.

Что делать, если в JSON есть ошибки форматирования?

Инструмент автоматически определяет валидность JSON. Если есть распространенные ошибки вроде конечных запятых, одинарных кавычек, пропущенных кавычек, появится кнопка «Исправить JSON». При нажатии инструмент попытается автоматически исправить и перегенерировать struct Go; при неудачном исправлении будет указано конкретное местоположение ошибки.

Будут ли данные загружены на сервер? Это конфиденциально и безопасно?

Нет. Весь парсинг JSON, вывод типов и генерация кода Go выполняются в вашем браузере через Web Worker; введенное содержимое и сгенерированный код никогда не загружаются ни на какой сервер и не записываются в облако. Чувствительный JSON, содержащий API-ключи, токены или бизнес-данные, можно использовать безопасно.

Можно ли разместить сгенерированный код прямо в проекты Go?

Да. Сгенерированный код — это стандартная struct Go с json-тегами, можно напрямую скопировать в каталог types/ или models/ проекта. Мы рекомендуем тонко настроить имена типов и имена пакетов в соответствии с соглашениями об именовании проекта.

Этот инструмент бесплатный? Нужно ли регистрироваться?

Полностью бесплатный, не требует регистрации или входа. Откройте страницу и используйте сразу, без ограничений функций, водяных знаков или принудительного входа.

Файлы JSON какого размера поддерживаются?

Инструмент не имеет строгих ограничений на размер файла, но скорость преобразования и производительность рендеринга зависят от производительности браузера и устройства. Мы рекомендуем обрабатывать JSON в пределах 1 МБ для лучшего опыта; для слишком большого JSON сначала обработайте через форматировщик JSON или инструмент разделения.

Будут ли числовые типы единообразно генерировать float64?

Нет. Инструмент различает целые числа и числа с плавающей точкой: целочисленные поля генерируют int64, поля с плавающей точкой генерируют float64. Если вы предпочитаете более конкретные типы вроде int, uint64, замените вручную после генерации.

Устранение неполадок

Справа отображается «Пожалуйста, введите данные JSON»

Левое поле ввода пустое или содержит только пробельные символы. Пожалуйста, вставьте действительный JSON, или нажмите «Пример» для загрузки данных, или перетащите файлы .json/.txt.

Показывает ошибку парсинга JSON, но не может найти местоположение ошибки

Нажмите кнопку «Исправить JSON» под полем ввода; инструмент автоматически попытается исправить конечные запятые, одинарные кавычки, пропущенные кавычки, объекты в стиле JS и другие проблемы. Измененный результат будет выделен после исправления.

Сгенерированные имена полей не соответствуют соглашениям об именовании Go

Инструмент генерирует имена полей в PascalCase из ключей JSON. Если ключи содержат китайский язык или специальные символы, могут генерироваться экранированные имена полей. Мы рекомендуем изменить ключи JSON на строчный английский или snake_case, затем единообразно настроить после генерации.

Поле null генерирует interface{}, хочу изменить на конкретный тип

Поскольку null не может вывести конкретный тип, инструмент использует interface{} как резерв. Вы можете дать этому полю пример значения (например "" или 0) в исходном JSON, перегенерировать, а затем изменить тип на фактический, например string/int64.

Страница тормозит после преобразования большого JSON

Рендеринг в браузере слишком большого JSON и большого количества struct потребляет значительную память. Рекомендации: ① Оставляйте только ключевые поля в примере JSON; ② Разделите на несколько объектов и преобразуйте отдельно; ③ Закройте другие потребляющие память вкладки в браузере.

Тип элемента массива выведен как []interface{}

Когда массив пуст [] или типы элементов несогласованы, инструмент использует interface{} как резерв. Вы можете добавить примеры элементов одного типа или вручную изменить тип на конкретные типы срезов вроде []string, []int64 после генерации.

Глоссарий

struct
Составной тип данных Go, используемый для объединения нескольких полей в один тип. Основная часть кода Go, генерируемого этим инструментом, состоит из нескольких определений struct.
slice
Динамический тип массива Go, синтаксис []T. Этот инструмент сопоставляет массивы JSON с соответствующими срезами, например []string, []int64, []UserItem.
json tag
Строка в обратных кавычках после поля struct Go, например `json:"user_name"`, используемая для указания имени поля при сериализации/десериализации encoding/json. Этот инструмент автоматически генерирует этот тег.
interface{}
Пустой тип интерфейса Go, может представлять любое значение. Этот инструмент использует interface{} как безопасный резерв при обнаружении null в JSON или неопределенном типе.
PascalCase
Стиль именования, при котором каждое слово начинается с заглавной буквы, например UserName, AddressCity. Go требует, чтобы экспортируемые поля начинались с заглавной буквы, поэтому этот инструмент автоматически преобразует имена полей JSON в PascalCase.
encoding/json
Пакет кодирования/декодирования JSON в стандартной библиотеке Go. После того как структуры, сгенерированные этим инструментом, сопряжены с json-тегами, json.Unmarshal и json.Marshal можно использовать напрямую.
unmarshal
Процесс парсинга потока байтов JSON в значение Go. После генерации struct наиболее распространенное использование — вызов json.Unmarshal(data, &user).
omitempty
Распространенная опция для json-тега Go, например `json:"name,omitempty"`, означает пропуск вывода, когда поле имеет нулевое значение. Этот инструмент по умолчанию не генерирует omitempty; добавьте вручную при необходимости после генерации.

Шпаргалка сопоставления типов JSON с типами Go

Этот инструмент автоматически выводит соответствующие типы Go на основе типа значения JSON; распространенные сопоставления следующие:

Пример значения JSONСгенерированный тип GoПримечание
"hello"stringПрямое сопоставление строк
true / falseboolБулево значение
42int64Число без десятичной точки
3.14float64Число с десятичной точкой
nullinterface{}Безопасный резерв, когда конкретный тип не может быть выведен
["a","b"][]stringМассив строк
[1,2,3][]int64Массив целых чисел
[{...},{...}][]UserItemМассив объектов, типы элементов генерируются рекурсивно
{"id":1}UserОбъект генерирует независимую struct

Рекомендации по выбору распространенных числовых типов в Go

Инструмент по умолчанию использует int64 и float64; настройте по мере необходимости в реальных проектах:

СценарийРекомендуемый типПричина
Обычные целочисленные ID, счетчикиint64Соответствует значению по умолчанию инструмента, совместимо с большинством чисел JSON
Автоинкрементный PK базы данных, известный как положительныйuint64Избегает отрицательных чисел, более ясная семантика
32-битные системы или явно малодиапазонные целые числаint32Уменьшает потребление памяти
Цены, координаты, научные вычисленияfloat64Соответствует значению по умолчанию инструмента, стандартная точность с плавающей точкой
Точные валютные вычисленияdecimal.Decimal / intfloat64 имеет риск точности; рекомендуем shopspring/decimal или int в единицах центов

Privacy & Security

Вся обработка этого инструмента JSON в Go полностью выполняется локально в вашем браузере: парсинг JSON, вывод типов, генерация кода Go выполняются на стороне клиента через Web Worker; введенное содержимое JSON, загруженные файлы и сгенерированный код Go никогда не загружаются ни на какой сервер, не записываются, не кэшируются и не хранятся в облаке. После закрытия или обновления страницы все входные и выходные данные автоматически очищаются из памяти, только localStorage сохраняет вашу последнюю историю ввода (можно очистить в любое время). Подходит для обработки JSON, содержащего API-ключи, токены, чувствительные бизнес-данные.