JSON to Go Struct

Generování Go struktur z JSON

Zkusit příklad
Název kořenové struktury:

Vstup JSON

Výstup Go

Běží lokálně · Bezpečné pro vkládání tajných údajů
Go struktury se zobrazí zde…

Co je převod JSON na Go Struct?

Převod JSON na Go struct je proces generování definic Go typů z dat JSON pro použití s balíčkem encoding/json ze standardní knihovny Go. Protože Go je staticky typované, každé pole JSON potřebuje odpovídající pole struktury se správným typem a struct tagem, který serializátoru říká, na který klíč JSON se mapuje. Ruční psaní těchto definic pro velké nebo hluboce vnořené API odpovědi je pomalé a náchylné k chybám.

Balíček encoding/json, definovaný ve specifikaci Go od verze 1.0, používá reflexi pro porovnávání klíčů JSON s exportovanými poli struktury. Porovnávání je ve výchozím nastavení nerozlišující velikost písmen, ale explicitní json struct tagy jsou standardní praxí, protože odstraňují nejednoznačnost a umožňují používat konvenci PascalCase jazyka Go, zatímco JSON zůstává v camelCase nebo snake_case. Převodník tuto práci automatizuje: přečte váš JSON, odvodí Go typy z hodnot a vypíše definice struktur se správnými tagy.

Typový systém Go se čistě mapuje na JSON. Řetězce se stávají string, booleovské hodnoty bool, celá čísla int a čísla s plovoucí desetinnou čárkou float64. Vnořené JSON objekty se stávají samostatnými pojmenovanými strukturami a pole se stávají slicy. Jediná mezera je null: Go nemá univerzální typ pro nullable hodnoty, proto se hodnoty null obvykle stávají typy ukazatelů (*string, *int) nebo interface{}. Generátor se s tím vším vypořádá v milisekundách.

Proč použít generátor JSON na Go?

Ruční definování Go struktur z JSON znamená počítání složených závorek, odhadování typů a přepisování tagů pokaždé, když se API změní. Generátor toto tření odstraňuje.

Okamžité generování typů
Vložte JSON a za méně než sekundu získáte správné definice Go struktur. Žádné ruční zadávání polí, žádné chybějící tagy, žádné problémy se zarovnáním.
🔒
Zpracování s důrazem na soukromí
Převod probíhá výhradně ve vašem prohlížeči. Váš JSON nikdy neopustí vaše zařízení. Klíče API, tokeny a uživatelská data zůstanou soukromé.
🏷️
Správné struct tagy
Každé vygenerované pole obsahuje json struct tag, který mapuje název pole Go na původní klíč JSON. Tím se předchází tichým neshodám při json.Unmarshal.
📦
Nevyžaduje instalaci ani registraci
Otevřete stránku a vložte JSON. Žádný Go toolchain není potřeba, žádné CLI nástroje k instalaci, žádné registrační formuláře k vyplňování.

Případy použití JSON na Go Struct

Vývoj klientů REST API
Generujte struktury požadavků a odpovědí pro REST API třetích stran. Vložte ukázkový JSON z dokumentace API a získejte typy připravené pro http.Client a json.NewDecoder.
Modely gRPC Gateway
Když Go služba vystavuje jak gRPC, tak REST endpointy, potřebujete Go struktury odpovídající JSON payloadům. Převeďte tvar JSON na struktury odpovídající vašim protobuf definicím.
Zpracování DevOps konfigurací
Zpracovávejte JSON konfigurační soubory (výstupy Terraform, manifesty Kubernetes, konfigurace CI/CD pipeline) na typované Go struktury pro vlastní nástroje a automatizační skripty.
Zpracování datových pipeline
Vytvářejte Go struktury pro JSON záznamy z front zpráv (Kafka, RabbitMQ, SQS) nebo datových jezer. Typované struktury zachytí změny schématu při kompilaci místo za běhu.
Nastavení testovacích přípravků
Převádějte JSON testovací přípravky na Go struktury pro testy řízené tabulkami. Typově bezpečné přípravky usnadňují diagnostiku selhání testů oproti raw map[string]interface{} assertionům.
Výuka typového systému Go
Studenti a vývojáři přicházející z dynamických jazyků mohou vložit známý JSON a vidět, jak Go reprezentuje stejná data s explicitními typy, ukazateli a struct tagy.

Mapování typů JSON na Go

Balíček encoding/json dodržuje specifická pravidla při mapování hodnot JSON na Go typy. Tabulka níže zobrazuje výchozí mapování a běžné alternativy. Sloupec "Výchozí" je to, co většina generátorů produkuje. Sloupec "Alternativa" zobrazuje typy, které můžete zvolit podle vašich požadavků, například int64 pro velká ID nebo typy ukazatelů pro nullable pole.

Typ JSONPříkladVýchozíAlternativa
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{}

Přehled Go JSON Struct tagů

Struct tagy ovládají, jak encoding/json serializuje a deserializuje pole. Tag json je zdaleka nejběžnější, ale můžete ho kombinovat s dalšími tagy (db, yaml, xml) na stejném poli. Syntaxe tagu je řetězec ohraničený zpětnými uvozovkami za typem pole. Níže jsou uvedeny možnosti json tagu, které encoding/json podporuje.

TagChováníPřípad použití
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 poskytuje dva způsoby dekódování JSON: json.Unmarshal pro byte slicy a json.NewDecoder pro proudy io.Reader. Oba používají stejná pravidla struct tagů, ale liší se tím, kdy je použít.

json.Unmarshal
Přijímá []byte a naplní strukturu. Nejlepší pro JSON, který je již celý v paměti: těla HTTP odpovědí načtená pomocí io.ReadAll, obsah souborů nebo testovací přípravky. Vrací chybu, pokud je JSON chybně formátovaný nebo typy nesouhlasí.
json.NewDecoder
Obaluje io.Reader a dekóduje JSON tokeny při příchodu. Nejlepší pro streamované zdroje: těla HTTP odpovědí čtená přímo, záznamy oddělené novým řádkem (NDJSON) nebo velké soubory, které nechcete celé načítat do paměti. Volajte Decode() ve smyčce s More() pro proudy s více objekty.

Příklady kódu

Tyto příklady ukazují, jak používat Go struktury vygenerované z JSON v reálných programech, a také jak je generovat z jiných jazyků. Příklady Go používají encoding/json ze standardní knihovny.

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
}

Časté dotazy

Jaký je rozdíl mezi json.Unmarshal a json.Decode?
json.Unmarshal přijímá []byte obsahující celý JSON dokument a naplní strukturu. json.NewDecoder obaluje io.Reader a dekóduje JSON postupně. Použijte Unmarshal, pokud již máte celý JSON v paměti (např. po io.ReadAll). Použijte NewDecoder při čtení přímo z těla HTTP odpovědi, souboru nebo jakéhokoli streamovaného zdroje, kde chcete zabránit ukládání celého payloadu do vyrovnávací paměti.
Jak Go zpracovává pole JSON, která chybí v payloadu?
Chybějící pole JSON ponechají odpovídající pole Go struktury na jejich nulové hodnotě: "" pro řetězce, 0 pro čísla, false pro booleovské hodnoty, nil pro ukazatele a slicy. Pokud potřebujete rozlišovat mezi "pole chybí" a "pole je přítomné, ale nulové", použijte typ ukazatele jako *int nebo *string. Nil ukazatel znamená, že pole chybělo; nenulový ukazatel s nulovou hodnotou znamená, že bylo explicitně nastaveno na 0 nebo "".
Proč musí být pole Go struktury exportovaná (s velkým písmenem) pro JSON?
Balíček encoding/json používá reflexi pro přístup k polím struktury a pravidla reflexe Go umožňují přístup pouze k exportovaným (velkým) polím. Pokud pole začíná malým písmenem, encoding/json ho nevidí a tiše ho přeskočí při serializaci i deserializaci. Použijte json struct tag pro mapování exportovaného pole v PascalCase na klíč JSON s malým písmenem.
Jak v Go zpracovat klíče JSON ve snake_case?
Přidejte json struct tag s přesným názvem klíče JSON. Například pole JSON "user_name" se mapuje na pole Go UserName s tagem `json:"user_name"`. Generátor to zpracovává automaticky. V balíčku encoding/json neexistuje globální volba pro nastavení zásad pojmenování; každé pole musí deklarovat svůj vlastní tag.
Lze převést JSON s hodnotami null na Go?
Ano. Null hodnoty JSON se mapují na typy ukazatelů v Go. Pole jako "age": null se stane Age *int `json:"age"`. Pokud je hodnota JSON null, Go ukazatel je nil. Pokud má hodnotu, Go alokuje int a ukazatel na něj odkazuje. Pro pole, která jsou vždy nullable, je použití ukazatele idiomatickým přístupem v Go.
Co se stane, pokud JSON obsahuje číslo větší, než dokáže Go int pojmout?
Go int závisí na platformě (32-bitový na 32-bitových systémech, 64-bitový na 64-bitových systémech). Pro velká čísla jako časová razítka JavaScript nebo ID databáze použijte explicitně int64. Pokud má číslo JSON desetinná místa, použijte float64. Pro čísla přesahující přesnost float64 (např. velké finanční hodnoty) použijte json.Number, který zachovává nezpracovanou řetězcovou reprezentaci a umožňuje vám ji parsovat samostatně.
Je mezi tímto nástrojem a JSON-to-Go-Struct nějaký rozdíl?
Tento nástroj generuje definice Go typů se zaměřením na vzory použití encoding/json: správné struct tagy, správné odvozování typů a zpracování vnořených struktur a polí. Nástroj JSON to Go Struct na tomto webu se zaměřuje na scaffolding struktur. Oba produkují platný Go kód. Použijte ten, který vyhovuje vašemu pracovnímu postupu. Přehled struct tagů a tabulky mapování typů na této stránce jsou užitečné bez ohledu na to, který generátor zvolíte.