JSON to Go Struct

Генерация Go struct из JSON

Попробовать пример
Имя корневого struct:

Ввод JSON

Вывод Go

Работает локально · Безопасно вставлять секреты
Go structs появятся здесь…

Что такое конвертация JSON в Go struct?

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

Пакет encoding/json, определённый в спецификации Go начиная с версии 1.0, использует рефлексию для сопоставления JSON-ключей с экспортируемыми полями struct. По умолчанию сопоставление выполняется без учёта регистра, однако явные теги struct json являются стандартной практикой: они устраняют неоднозначность и позволяют использовать соглашение PascalCase в Go, пока JSON остаётся в camelCase или snake_case. Конвертер автоматизирует этот процесс: читает JSON, определяет типы Go из значений и выводит определения struct с правильными тегами.

Система типов Go чисто отображается на JSON. Строки становятся string, булевы значения — bool, целые числа — int, а числа с плавающей точкой — float64. Вложенные JSON-объекты становятся отдельными именованными struct, а массивы — слайсами. Единственный пробел — null: в Go нет универсального nullable-типа, поэтому null-значения обычно становятся типами-указателями (*string, *int) или interface{}. Генератор справляется со всем этим за миллисекунды.

Зачем использовать конвертер JSON в Go?

Определять Go struct из JSON вручную — значит считать фигурные скобки, угадывать типы и переписывать теги каждый раз при изменении API. Конвертер снимает это трение.

Мгновенная генерация типов
Вставьте JSON и получите корректные определения Go struct менее чем за секунду. Никакого ручного ввода полей, пропущенных тегов и трудностей с выравниванием.
🔒
Обработка с приоритетом конфиденциальности
Конвертация выполняется полностью в браузере. JSON не покидает вашу машину. API-ключи, токены и пользовательские данные остаются конфиденциальными.
🏷️
Корректные теги struct
Каждое сгенерированное поле содержит тег struct json, сопоставляющий имя поля Go с исходным ключом JSON. Это предотвращает скрытые несоответствия при выполнении json.Unmarshal.
📦
Без установки и регистрации
Откройте страницу и вставьте JSON. Инструментальная цепочка Go не требуется, CLI-инструменты устанавливать не нужно, аккаунт создавать не нужно.

Сценарии использования JSON to Go Struct

Разработка клиентов REST API
Генерируйте struct для запросов и ответов сторонних REST API. Вставьте пример JSON из документации API и получите типы, готовые для использования с http.Client и json.NewDecoder.
Модели gRPC Gateway
Когда Go-сервис предоставляет как gRPC, так и REST-эндпоинты, нужны Go struct, соответствующие JSON-пейлоадам. Преобразуйте форму JSON в struct, соответствующие вашим protobuf-определениям.
Разбор конфигурации DevOps
Разбирайте JSON-файлы конфигурации (вывод Terraform, манифесты Kubernetes, конфигурации CI/CD-пайплайнов) в типизированные Go struct для пользовательской оснастки и скриптов автоматизации.
Обработка данных в пайплайнах
Создавайте Go struct для JSON-записей из очередей сообщений (Kafka, RabbitMQ, SQS) или озёр данных. Типизированные struct выявляют изменения схемы на этапе компиляции, а не во время выполнения.
Настройка тестовых фикстур
Преобразуйте JSON-тестовые фикстуры в Go struct для табличных тестов. Типобезопасные фикстуры делают диагностику ошибок в тестах проще, чем сырые утверждения map[string]interface{}.
Изучение системы типов Go
Студенты и разработчики, приходящие из динамических языков, могут вставить знакомый JSON и увидеть, как Go представляет те же данные с помощью явных типов, указателей и тегов struct.

Справочник по сопоставлению типов JSON и Go

Пакет encoding/json следует определённым правилам при сопоставлении JSON-значений с типами Go. В таблице ниже показано сопоставление по умолчанию и распространённые альтернативы. Столбец «По умолчанию» — это то, что производит большинство генераторов. Столбец «Альтернатива» содержит типы, которые вы можете выбрать исходя из своих требований, например int64 для больших ID или типы-указатели для nullable-полей.

Тип JSONПримерПо умолчаниюАльтернатива
string"hello"stringstring
number (integer)42intint64
number (float)3.14float64float64
booleantrueboolbool
nullnullinterface{}*string / *int
object{"k": "v"}structstruct
array of strings["a", "b"][]string[]string
array of objects[{"id": 1}][]Item[]Item
mixed array[1, "a"][]interface{}[]interface{}

Справочник тегов struct для JSON в Go

Теги struct управляют тем, как encoding/json сериализует и десериализует поля. Тег json является наиболее распространённым, но его можно комбинировать с другими тегами (db, yaml, xml) на одном поле. Синтаксис тега — строка в обратных кавычках после типа поля. Ниже приведены параметры тега json, поддерживаемые encoding/json.

ТегПоведениеСценарий использования
json:"name"Maps struct field to JSON key "name"Always generated
json:"name,omitempty"Omits field from output if zero valueOptional fields
json:"-"Field is never serialized or deserializedInternal fields
json:"name,string"Encodes int/bool as JSON stringString-encoded numbers

json.Unmarshal vs json.NewDecoder

Go предоставляет два способа декодирования JSON: json.Unmarshal для байтовых срезов и json.NewDecoder для потоков io.Reader. Оба используют одни и те же правила тегов struct, но различаются по области применения.

json.Unmarshal
Принимает []byte и заполняет struct. Лучший вариант для JSON, который уже полностью находится в памяти: тела HTTP-ответов, прочитанные с помощью io.ReadAll, содержимое файлов или тестовые фикстуры. Возвращает ошибку, если JSON некорректен или типы не совпадают.
json.NewDecoder
Оборачивает io.Reader и декодирует JSON-токены по мере их поступления. Лучший вариант для потоковых источников: тела HTTP-ответов, читаемые напрямую, JSON с разделением по строкам (NDJSON), или большие файлы, которые нецелесообразно полностью загружать в память. Вызывайте Decode() в цикле с More() для потоков из нескольких объектов.

Примеры кода

Эти примеры показывают, как использовать Go struct, сгенерированные из JSON, в реальных программах, а также как генерировать их из других языков. Примеры на Go используют encoding/json из стандартной библиотеки.

Go (json.Unmarshal)
package main

import (
	"encoding/json"
	"fmt"
)

type User struct {
	ID       int      `json:"id"`
	Name     string   `json:"name"`
	Email    string   `json:"email"`
	IsActive bool     `json:"is_active"`
	Tags     []string `json:"tags"`
}

func main() {
	data := []byte(`{"id":1,"name":"Alice","email":"alice@example.com","is_active":true,"tags":["admin","editor"]}`)

	var user User
	if err := json.Unmarshal(data, &user); err != nil {
		panic(err)
	}
	fmt.Println(user.Name)  // → Alice
	fmt.Println(user.Tags)  // → [admin editor]
}
JavaScript (fetch + type reference)
// JSON response from API — this is the shape you'd convert to Go:
const res = await fetch("https://api.example.com/users/1");
const user = await res.json();
// user → { "id": 1, "name": "Alice", "email": "alice@example.com" }

// Equivalent Go struct:
// type User struct {
//     ID    int    `json:"id"`
//     Name  string `json:"name"`
//     Email string `json:"email"`
// }
Python (generate Go structs from JSON)
import json

def json_to_go(data: dict, name: str = "Root") -> str:
    lines = [f"type {name} struct {{"]
    type_map = {str: "string", int: "int", float: "float64", bool: "bool"}

    for key, value in data.items():
        go_type = type_map.get(type(value), "interface{}")
        field = key.title().replace("_", "")  # snake_case → PascalCase
        lines.append(f'\t{field} {go_type} `json:"{key}"`')
    lines.append("}")
    return "\n".join(lines)

data = json.loads('{"user_name": "Alice", "age": 30, "verified": true}')
print(json_to_go(data))
# type Root struct {
#     UserName string `json:"user_name"`
#     Age      int    `json:"age"`
#     Verified bool   `json:"verified"`
# }
Go (json.Decoder for streams)
package main

import (
	"encoding/json"
	"fmt"
	"strings"
)

type Event struct {
	Type    string `json:"type"`
	Payload string `json:"payload"`
}

func main() {
	stream := strings.NewReader(`{"type":"click","payload":"btn-1"}
{"type":"scroll","payload":"page-2"}`)

	dec := json.NewDecoder(stream)
	for dec.More() {
		var ev Event
		if err := dec.Decode(&ev); err != nil {
			break
		}
		fmt.Printf("%s: %s\n", ev.Type, ev.Payload)
	}
	// → click: btn-1
	// → scroll: page-2
}

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

В чём разница между json.Unmarshal и json.Decode?
json.Unmarshal принимает []byte, содержащий полный JSON-документ, и заполняет struct. json.NewDecoder оборачивает io.Reader и декодирует JSON инкрементально. Используйте Unmarshal, когда у вас уже есть полный JSON в памяти (например, после io.ReadAll). Используйте NewDecoder при чтении напрямую из тела HTTP-ответа, файла или любого потокового источника, где вы хотите избежать буферизации всей полезной нагрузки.
Как Go обрабатывает JSON-поля, отсутствующие в полезной нагрузке?
Отсутствующие JSON-поля оставляют соответствующее поле Go struct в нулевом значении: "" для строк, 0 для чисел, false для булевых значений, nil для указателей и срезов. Если нужно различать «поле отсутствует» и «поле присутствует, но равно нулю», используйте тип-указатель, например *int или *string. Nil-указатель означает, что поле отсутствовало; ненулевой указатель с нулевым значением означает, что оно было явно установлено в 0 или "".
Почему поля Go struct должны быть экспортируемыми (с заглавной буквы) для JSON?
Пакет encoding/json использует рефлексию для доступа к полям struct, а правила рефлексии Go разрешают доступ только к экспортируемым (начинающимся с заглавной буквы) полям. Если поле начинается со строчной буквы, encoding/json не видит его и молча пропускает как при маршалинге, так и при анмаршалинге. Используйте тег struct json, чтобы сопоставить экспортируемое поле в PascalCase с ключом JSON в нижнем регистре.
Как обрабатывать ключи JSON в snake_case в Go?
Добавьте тег struct json с точным именем ключа JSON. Например, поле JSON "user_name" сопоставляется с полем Go UserName с тегом `json:"user_name"`. Генератор делает это автоматически. В encoding/json нет глобальной опции для установки политики именования; каждое поле должно объявлять собственный тег.
Можно ли конвертировать JSON с null-значениями в Go?
Да. Null-значения JSON отображаются на типы-указатели в Go. Поле вида "age": null становится Age *int `json:"age"`. Когда JSON-значение равно null, указатель Go равен nil. Когда у него есть значение, Go выделяет int и указатель ссылается на него. Для полей, которые всегда могут быть null, использование указателя является идиоматическим подходом в Go.
Что происходит, если JSON содержит число больше, чем может вместить int в Go?
Тип int в Go зависит от платформы (32-битный на 32-битных системах, 64-битный на 64-битных). Для больших чисел, таких как временны́е метки JavaScript или идентификаторы из базы данных, явно используйте int64. Если JSON-число имеет десятичные знаки, используйте float64. Для чисел, превышающих точность float64 (например, больших финансовых значений), используйте json.Number, который сохраняет строковое представление и позволяет разобрать его самостоятельно.
Есть ли разница между этим инструментом и JSON-to-Go-Struct?
Этот инструмент генерирует определения типов Go с акцентом на паттерны использования encoding/json: корректные теги struct, правильный вывод типов и обработка вложенных структур и массивов. Инструмент JSON to Go Struct на этом сайте сосредоточен на формировании каркаса struct. Оба производят корректный код Go. Используйте тот, который лучше вписывается в ваш рабочий процесс. Справочник тегов struct и таблицы сопоставления типов на этой странице полезны независимо от выбранного генератора.