Конвертер JSON в структуры Go

Преобразуйте JSON в структуры Go с тегами json, а также вспомогательными функциями Unmarshal и Marshal на базе encoding/json.

Генерация структур Go с тегами json из JSON

В Go для каждого декодируемого JSON-объекта нужна структура, а каждому полю — тег json, если ключ не совпадает с именем в Go. Конвертер напишет эти структуры за вас: ключи в snake_case, например allowed_origins, превращаются в экспортируемые поля вроде AllowedOrigins с соответствующим тегом json, вложенные объекты становятся отдельными типами struct, целые числа — int64, а дробные — float64. Также добавляются функция Unmarshal и метод Marshal на основе стандартного пакета encoding/json, так что сторонние зависимости не нужны.

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

  1. Вставьте пример JSON — например, файл конфигурации или ответ API.
  2. Введите имя корневой структуры, например ServerConfig.
  3. Скопируйте код в файл .go, замените package main на имя своего пакета и декодируйте данные через json.Unmarshal или сгенерированную функцию Unmarshal.

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

Почему числа генерируются как int64, а не int?
В JSON нет ограничения на размер целых чисел, поэтому int64 — безопасный выбор на любой платформе. Если вы знаете диапазон значений, после копирования можно заменить тип поля на int.
Как добавить omitempty в теги json?
Генератор пишет простые теги, соответствующие ключам из примера. Добавьте ,omitempty вручную к полям, которые при Marshal нужно пропускать, если они пустые; на декодирование это никак не влияет.
Как обрабатываются nullable- и отсутствующие поля?
Если в примере поле равно null или отсутствует в части элементов массива, оно генерируется как указатель, например *string, чтобы можно было отличить отсутствующее значение от пустого.

Пример: JSON в Go

Исходный JSON

{
  "host": "0.0.0.0",
  "port": 8080,
  "debug": false,
  "allowed_origins": ["https://jsonkit.org"],
  "database": { "dsn": "postgres://localhost/app", "max_conns": 20 }
}

Сгенерированный код: Go (ServerConfig)

// Code generated from JSON Schema using quicktype. DO NOT EDIT.
// To parse and unparse this JSON data, add this code to your project and do:
//
//    serverConfig, err := UnmarshalServerConfig(bytes)
//    bytes, err = serverConfig.Marshal()

package main

import "encoding/json"

func UnmarshalServerConfig(data []byte) (ServerConfig, error) {
	var r ServerConfig
	err := json.Unmarshal(data, &r)
	return r, err
}

func (r *ServerConfig) Marshal() ([]byte, error) {
	return json.Marshal(r)
}

type ServerConfig struct {
	Host           string   `json:"host"`
	Port           int64    `json:"port"`
	Debug          bool     `json:"debug"`
	AllowedOrigins []string `json:"allowed_origins"`
	Database       Database `json:"database"`
}

type Database struct {
	DSN      string `json:"dsn"`
	MaxConns int64  `json:"max_conns"`
}

Преобразовать JSON в другие языки