JSON do struktury Go

Generuj struktury Go z JSON

Wypróbuj przykład
Nazwa struktury głównej:

Wejście JSON

Wyjście Go

Działa lokalnie · Bezpieczne do wklejania sekretów
Struktury Go pojawią się tutaj…

Czym jest konwersja JSON do struktury Go?

Konwersja JSON do struktury Go przekształca surowe dane JSON w definicje typów Go działające z pakietem encoding/json ze standardowej biblioteki Go. Go jest językiem statycznie typowanym, więc każde pole JSON wymaga odpowiedniego pola struktury z poprawnym typem oraz tagiem struktury informującym serializator, który klucz JSON należy odwzorować. Ręczne pisanie tych definicji dla dużych lub głęboko zagnieżdżonych odpowiedzi API jest powolne i łatwe do pomylenia.

Pakiet encoding/json, obecny w specyfikacji Go od wersji 1.0, używa refleksji do dopasowania kluczy JSON do eksportowanych pól struktury. Domyślnie dopasowanie jest bez rozróżnienia wielkości liter, ale jawne tagi json są standardową praktyką, ponieważ eliminują niejednoznaczność i pozwalają używać konwencji PascalCase Go, podczas gdy JSON pozostaje w camelCase lub snake_case. Konwerter automatyzuje ten proces: odczytuje JSON, wnioskuje typy Go z wartości i generuje definicje struktur z poprawnymi tagami.

System typów Go mapuje się czytelnie na JSON. Ciągi znaków stają się string, wartości logiczne — bool, liczby całkowite — int, a liczby zmiennoprzecinkowe — float64. Zagnieżdżone obiekty JSON stają się oddzielnymi nazwanymi strukturami, a tablice — wycinkami (slice). Jedyna luka to null: Go nie ma uniwersalnego typu dopuszczającego null, więc wartości null zazwyczaj stają się typami wskaźnikowymi (*string, *int) lub interface{}. Generator obsługuje to wszystko w milisekundy.

Dlaczego warto używać konwertera JSON do Go?

Ręczne definiowanie struktur Go z JSON oznacza liczenie nawiasów klamrowych, zgadywanie typów i przepisywanie tagów za każdym razem, gdy API się zmienia. Konwerter usuwa te niedogodności.

Natychmiastowe generowanie typów
Wklej swój JSON i otrzymaj poprawne definicje struktur Go w mniej niż sekundę. Żadnego ręcznego wpisywania pól, żadnych pominiętych tagów, żadnych problemów z wyrównaniem.
🔒
Przetwarzanie z zachowaniem prywatności
Konwersja odbywa się całkowicie w przeglądarce. Twoje dane JSON nigdy nie opuszczają Twojego urządzenia. Klucze API, tokeny i dane użytkowników pozostają prywatne.
🏷️
Poprawne tagi struktury
Każde wygenerowane pole zawiera tag json struktury mapujący nazwę pola Go na oryginalny klucz JSON. Zapobiega to cichym niezgodnościom podczas json.Unmarshal.
📦
Bez instalacji i rejestracji
Otwórz stronę i wklej swój JSON. Nie wymaga łańcucha narzędzi Go, żadnych narzędzi CLI do zainstalowania, żadnego konta do założenia.

Przypadki użycia JSON do struktury Go

Tworzenie klientów REST API
Generuj struktury żądań i odpowiedzi dla zewnętrznych REST API. Wklej przykładowy JSON z dokumentacji API i otrzymaj typy gotowe dla http.Client i json.NewDecoder.
Modele bramki gRPC
Gdy serwis Go udostępnia zarówno endpointy gRPC, jak i REST, potrzebujesz struktur Go pasujących do zawartości JSON. Konwertuj schemat JSON na struktury odpowiadające definicjom protobuf.
Parsowanie konfiguracji DevOps
Parsuj pliki konfiguracyjne JSON (wyjścia Terraform, manifesty Kubernetes, konfiguracje potoków CI/CD) do typowanych struktur Go dla niestandardowych narzędzi i skryptów automatyzacji.
Przetwarzanie potoków danych
Buduj struktury Go dla rekordów JSON z kolejek wiadomości (Kafka, RabbitMQ, SQS) lub jezior danych. Typowane struktury wychwytują zmiany schematu podczas kompilacji zamiast w czasie działania.
Konfiguracja danych testowych
Konwertuj dane testowe JSON na struktury Go dla testów sterowanych tabelą. Dane testowe z typami sprawiają, że błędy testów łatwiej diagnozować niż przy surowych asercjach map[string]interface{}.
Nauka systemu typów Go
Studenci i programiści przychodzący z języków dynamicznych mogą wkleić znany JSON i zobaczyć, jak Go reprezentuje te same dane z jawnymi typami, wskaźnikami i tagami struktury.

Mapowanie typów JSON do Go

Pakiet encoding/json stosuje określone reguły mapowania wartości JSON na typy Go. Poniższa tabela przedstawia domyślne mapowanie i popularne alternatywy. Kolumna "Domyślny" pokazuje to, co większość generatorów produkuje. Kolumna "Alternatywny" pokazuje typy, które możesz wybrać na podstawie swoich wymagań, np. int64 dla dużych identyfikatorów lub typy wskaźnikowe dla pól dopuszczających null.

Typ JSONPrzykładDomyślnyAlternatywny
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{}

Informacje o tagach json struktury Go

Tagi struktury kontrolują sposób serializacji i deserializacji pól przez encoding/json. Tag json jest zdecydowanie najpowszechniejszy, ale możesz łączyć go z innymi tagami (db, yaml, xml) w tym samym polu. Składnia tagu to ciąg znaków ujęty w znaki backtick po typie pola. Oto opcje tagu json obsługiwane przez encoding/json.

TagZachowaniePrzypadek użycia
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 a json.NewDecoder

Go oferuje dwa sposoby dekodowania JSON: json.Unmarshal dla wycinków bajtów i json.NewDecoder dla strumieni io.Reader. Oba używają tych samych reguł tagów struktury, ale różnią się sytuacjami, w których należy ich używać.

json.Unmarshal
Przyjmuje []byte i wypełnia strukturę. Najlepszy wybór dla JSON, który jest już w całości w pamięci: ciała odpowiedzi HTTP odczytane przez io.ReadAll, zawartość plików lub dane testowe. Zwraca błąd, jeśli JSON jest nieprawidłowy lub typy nie pasują.
json.NewDecoder
Opakowuje io.Reader i dekoduje tokeny JSON w miarę ich napływania. Najlepszy dla źródeł strumieniowych: ciała odpowiedzi HTTP odczytywane bezpośrednio, JSON z separatorem nowej linii (NDJSON), lub duże pliki, których nie chcesz ładować w całości do pamięci. Wywołuj Decode() w pętli z More() dla strumieni z wieloma obiektami.

Przykłady kodu

Te przykłady pokazują, jak używać struktur Go wygenerowanych z JSON w prawdziwych programach, a także jak generować je z innych języków. Przykłady Go używają encoding/json ze standardowej biblioteki.

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
}

Często zadawane pytania

Jaka jest różnica między json.Unmarshal a json.Decode?
json.Unmarshal przyjmuje []byte zawierający pełny dokument JSON i wypełnia strukturę. json.NewDecoder opakowuje io.Reader i dekoduje JSON przyrostowo. Używaj Unmarshal, gdy masz już kompletny JSON w pamięci (np. po io.ReadAll). Używaj NewDecoder podczas odczytu bezpośrednio z ciała odpowiedzi HTTP, pliku lub dowolnego źródła strumieniowego, gdy chcesz uniknąć buforowania całego ładunku.
Jak Go obsługuje pola JSON nieobecne w ładunku?
Brakujące pola JSON pozostawiają odpowiednie pole struktury Go przy zerowej wartości: "" dla ciągów znaków, 0 dla liczb, false dla wartości logicznych, nil dla wskaźników i wycinków. Jeśli chcesz rozróżnić między "pole nieobecne" a "pole obecne, ale zerowe", używaj typu wskaźnikowego jak *int lub *string. Wskaźnik nil oznacza, że pole było nieobecne; wskaźnik niepusty z zerową wartością oznacza, że pole było jawnie ustawione na 0 lub "".
Dlaczego pola struktury Go muszą być eksportowane (z wielką literą) dla JSON?
Pakiet encoding/json używa refleksji do dostępu do pól struktury, a reguły refleksji Go zezwalają tylko na dostęp do eksportowanych (pisanych wielką literą) pól. Jeśli pole zaczyna się od małej litery, encoding/json nie może go zobaczyć i cicho pomija je podczas serializacji i deserializacji. Używaj tagu json struktury, aby odwzorować eksportowane pole PascalCase na klucz JSON pisany małą literą.
Jak obsługiwać klucze JSON w snake_case w Go?
Dodaj tag json struktury z dokładną nazwą klucza JSON. Na przykład pole JSON "user_name" mapuje się na pole Go UserName z tagiem `json:"user_name"`. Generator obsługuje to automatycznie. W pakiecie encoding/json nie ma globalnej opcji do ustawienia zasad nazewnictwa — każde pole musi deklarować własny tag.
Czy mogę konwertować JSON z wartościami null do Go?
Tak. Wartości null w JSON mapują się na typy wskaźnikowe w Go. Pole takie jak "age": null staje się Age *int `json:"age"`. Gdy wartość JSON to null, wskaźnik Go jest nil. Gdy ma wartość, Go alokuje int i wskaźnik go wskazuje. Dla pól, które zawsze mogą mieć wartość null, użycie wskaźnika jest idiomatycznym podejściem w Go.
Co się dzieje, gdy JSON zawiera liczbę większą niż może pomieścić int w Go?
Typ int w Go jest zależny od platformy (32-bitowy na systemach 32-bitowych, 64-bitowy na systemach 64-bitowych). Dla dużych liczb, takich jak znaczniki czasu JavaScript lub identyfikatory baz danych, używaj jawnie int64. Jeśli liczba JSON ma część dziesiętną, używaj float64. Dla liczb przekraczających precyzję float64 (np. duże wartości finansowe) używaj json.Number, który zachowuje surową reprezentację ciągu znaków i pozwala samodzielnie je parsować.
Czy jest różnica między tym narzędziem a generatorem JSON do struktury Go?
To narzędzie generuje definicje typów Go ze szczególnym naciskiem na wzorce użycia encoding/json: poprawne tagi struktury, właściwe wnioskowanie typów oraz obsługę zagnieżdżonych struktur i tablic. Narzędzie JSON do struktury Go na tej stronie skupia się na tworzeniu szkieletu struktury. Oba produkują poprawny kod Go. Używaj tego, które pasuje do Twojego przepływu pracy. Tabela tagów struktury i mapowania typów na tej stronie jest przydatna niezależnie od wybranego generatora.