JSON to Go Struct

Генерація структур Go з JSON

Спробувати приклад
Назва кореневої структури:

Введення JSON

Виведення Go

Працює локально · Безпечно вставляти секрети
Структури Go з'являться тут…

Що таке конвертація JSON у структури Go?

Конвертація JSON у структури Go перетворює сирі JSON-дані на визначення типів Go, що працюють із пакетом encoding/json зі стандартної бібліотеки Go. Go є статично типізованою мовою, тому кожне JSON-поле потребує відповідного поля структури з правильним типом і тегом, який повідомляє серіалізатору, який JSON-ключ відображати. Написання таких визначень вручну для великих або глибоко вкладених відповідей API є повільним і схильним до помилок.

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

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

Навіщо використовувати конвертер JSON у структури Go?

Визначення структур Go з JSON вручну означає підрахунок дужок, здогадки про типи та переписування тегів щоразу, коли API змінюється. Конвертер усуває це тертя.

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

Сценарії використання JSON to Go Struct

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

Таблиця відповідності типів JSON та Go

Пакет encoding/json дотримується конкретних правил при відображенні JSON-значень на типи Go. Таблиця нижче показує стандартне відображення та поширені альтернативи. Стовпець «За замовчуванням» — це те, що виробляє більшість генераторів. Стовпець «Альтернатива» показує типи, які ви можете обрати відповідно до ваших вимог, наприклад int64 для великих ID або вказівні типи для полів, що допускають null.

Тип 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{}

Довідник тегів структур Go JSON

Теги структур керують тим, як 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 та json.NewDecoder

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

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

Приклади коду

Ці приклади показують, як використовувати структури Go, згенеровані з 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-документом і заповнює структуру. json.NewDecoder обгортає io.Reader і декодує JSON поступово. Використовуйте Unmarshal, коли у вас вже є повний JSON в пам'яті (наприклад, після io.ReadAll). Використовуйте NewDecoder під час читання безпосередньо з тіла HTTP-відповіді, файлу або будь-якого потокового джерела, де ви хочете уникнути буферизації всього пейлоаду.
Як Go обробляє JSON-поля, що відсутні в пейлоаді?
Відсутні JSON-поля залишають відповідне поле структури Go зі своїм нульовим значенням: "" для рядків, 0 для чисел, false для булевих значень, nil для вказівників і зрізів. Якщо вам потрібно розрізнити «поле відсутнє» і «поле присутнє, але нульове», використовуйте вказівний тип на кшталт *int або *string. Nil-вказівник означає, що поле було відсутнє; ненульовий вказівник із нульовим значенням означає, що воно було явно встановлено в 0 або "".
Чому поля структур Go мають бути експортованими (з великої літери) для JSON?
Пакет encoding/json використовує рефлексію для доступу до полів структур, а правила рефлексії Go дозволяють доступ лише до експортованих (з великої літери) полів. Якщо поле починається з малої літери, encoding/json не може його побачити і мовчки пропустить його під час серіалізації та десеріалізації. Використовуйте json-тег структури для відображення експортованого поля PascalCase на ключ JSON у нижньому регістрі.
Як обробляти JSON-ключі у snake_case у Go?
Додайте 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: правильні теги структур, належне визначення типів і обробку вкладених структур і масивів. Інструмент JSON to Go Struct на цьому сайті зосереджений на каркасі структур. Обидва виробляють коректний код Go. Використовуйте той, що відповідає вашому робочому процесу. Довідник тегів структур і таблиці відображення типів на цій сторінці корисні незалежно від того, який генератор ви оберете.