JSON to Go Struct

Hasilkan Go struct dari JSON

Coba contoh
Nama struct root:

Input JSON

Output Go

Berjalan lokal ยท Aman untuk menempel rahasia
Go struct akan muncul di siniโ€ฆ

Apa itu Konversi JSON ke Go Struct?

Konversi JSON ke Go mengubah data JSON mentah menjadi definisi tipe Go yang bekerja dengan paket encoding/json dari pustaka standar Go. Go adalah bahasa bertipe statis, sehingga setiap field JSON memerlukan field struct yang sesuai dengan tipe yang benar dan struct tag yang memberi tahu serializer kunci JSON mana yang dipetakan. Menulis definisi-definisi ini secara manual untuk respons API yang besar atau sangat bersarang itu lambat dan mudah keliru.

Paket encoding/json, yang telah ada dalam spesifikasi Go sejak Go 1.0, menggunakan reflection untuk mencocokkan kunci JSON dengan field struct yang diekspor. Pencocokan bersifat case-insensitive secara default, tetapi struct tag json yang eksplisit adalah praktik standar karena menghilangkan ambiguitas dan memungkinkan penggunaan konvensi PascalCase Go sementara JSON tetap dalam camelCase atau snake_case. Sebuah konverter mengotomatiskan ini: ia membaca JSON Anda, menyimpulkan tipe Go dari nilai-nilainya, dan menghasilkan definisi struct dengan tag yang benar.

Sistem tipe Go memetakan JSON dengan bersih. String menjadi string, boolean menjadi bool, integer menjadi int, dan angka floating-point menjadi float64. Objek JSON bersarang menjadi struct bernama terpisah, dan array menjadi slice. Satu celah adalah null: Go tidak memiliki tipe nullable universal, sehingga nilai null biasanya menjadi tipe pointer (*string, *int) atau interface{}. Sebuah generator menangani semua ini dalam hitungan milidetik.

Mengapa Menggunakan Konverter JSON ke Go?

Mendefinisikan Go struct dari JSON secara manual berarti menghitung kurung kurawal, menebak tipe, dan menulis ulang tag setiap kali API berubah. Sebuah konverter menghilangkan gesekan tersebut.

โšก
Pembuatan tipe secara instan
Tempel JSON Anda dan dapatkan definisi Go struct yang benar dalam waktu kurang dari satu detik. Tanpa pengetikan field manual, tanpa tag yang terlewat, tanpa masalah penyelarasan.
๐Ÿ”’
Pemrosesan mengutamakan privasi
Konversi berjalan sepenuhnya di browser Anda. JSON Anda tidak pernah meninggalkan perangkat Anda. API key, token, dan data pengguna tetap bersifat privat.
๐Ÿท๏ธ
Struct tag yang benar
Setiap field yang dihasilkan menyertakan struct tag json yang memetakan nama field Go ke kunci JSON aslinya. Ini mencegah ketidakcocokan yang tidak terdeteksi selama json.Unmarshal.
๐Ÿ“ฆ
Tanpa instalasi atau daftar
Buka halaman dan tempel JSON Anda. Tidak perlu Go toolchain, tidak ada alat CLI yang perlu diinstal, tidak ada akun yang perlu dibuat.

Kasus Penggunaan JSON ke Go Struct

Pengembangan Klien REST API
Hasilkan struct request dan response untuk REST API pihak ketiga. Tempel contoh JSON dari dokumentasi API dan dapatkan tipe yang siap digunakan dengan http.Client dan json.NewDecoder.
Model gRPC Gateway
Ketika sebuah layanan Go mengekspos endpoint gRPC dan REST sekaligus, Anda memerlukan Go struct yang cocok dengan payload JSON. Konversi bentuk JSON menjadi struct yang sesuai dengan definisi protobuf Anda.
Penguraian Konfigurasi DevOps
Urai file konfigurasi JSON (output Terraform, manifes Kubernetes, konfigurasi pipeline CI/CD) menjadi Go struct bertipe untuk tooling kustom dan skrip otomasi.
Pemrosesan Pipeline Data
Bangun Go struct untuk record JSON dari message queue (Kafka, RabbitMQ, SQS) atau data lake. Struct bertipe mendeteksi perubahan skema pada waktu kompilasi, bukan saat runtime.
Penyiapan Fixture Pengujian
Konversi fixture JSON pengujian menjadi Go struct untuk pengujian berbasis tabel. Fixture bertipe aman membuat kegagalan pengujian lebih mudah didiagnosis daripada asersi map[string]interface{}.
Belajar Sistem Tipe Go
Mahasiswa dan pengembang yang berasal dari bahasa dinamis dapat menempel JSON yang sudah dikenal dan melihat bagaimana Go merepresentasikan data yang sama dengan tipe eksplisit, pointer, dan struct tag.

Pemetaan Tipe JSON ke Go

Paket encoding/json mengikuti aturan tertentu saat memetakan nilai JSON ke tipe Go. Tabel di bawah menunjukkan pemetaan default dan alternatif yang umum. Kolom "Default" adalah yang dihasilkan oleh sebagian besar generator. Kolom "Alternatif" menampilkan tipe yang mungkin Anda pilih berdasarkan kebutuhan, seperti int64 untuk ID besar atau tipe pointer untuk field nullable.

Tipe JSONContohDefaultAlternatif
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{}

Referensi Struct Tag JSON di Go

Struct tag mengontrol cara encoding/json melakukan serialisasi dan deserialisasi field. Tag json adalah yang paling umum digunakan, tetapi Anda dapat menggabungkannya dengan tag lain (db, yaml, xml) pada field yang sama. Sintaks tag adalah string yang dibatasi backtick setelah tipe field. Berikut adalah opsi tag json yang didukung encoding/json.

TagPerilakuKasus Penggunaan
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 menyediakan dua cara untuk mendekode JSON: json.Unmarshal untuk slice byte dan json.NewDecoder untuk stream io.Reader. Keduanya menggunakan aturan struct tag yang sama, tetapi berbeda dalam kapan harus digunakan.

json.Unmarshal
Menerima []byte dan mengisi struct. Terbaik untuk JSON yang sudah sepenuhnya ada di memori: body respons HTTP yang dibaca dengan io.ReadAll, konten file, atau fixture pengujian. Mengembalikan error jika JSON tidak valid atau tipe tidak cocok.
json.NewDecoder
Membungkus io.Reader dan mendekode token JSON saat datang. Terbaik untuk sumber streaming: body respons HTTP yang dibaca langsung, log JSON berpemisah baris baru (NDJSON), atau file besar yang tidak ingin Anda muat sepenuhnya ke memori. Panggil Decode() dalam sebuah loop dengan More() untuk stream multi-objek.

Contoh Kode

Contoh-contoh ini menunjukkan cara menggunakan Go struct yang dihasilkan dari JSON dalam program nyata, beserta cara menghasilkannya dari bahasa lain. Contoh Go menggunakan encoding/json dari pustaka standar.

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
}

Pertanyaan yang Sering Diajukan

Apa perbedaan antara json.Unmarshal dan json.Decode?
json.Unmarshal menerima []byte yang berisi dokumen JSON lengkap dan mengisi struct. json.NewDecoder membungkus io.Reader dan mendekode JSON secara bertahap. Gunakan Unmarshal ketika Anda sudah memiliki JSON lengkap di memori (misalnya, setelah io.ReadAll). Gunakan NewDecoder saat membaca langsung dari body respons HTTP, file, atau sumber streaming apa pun di mana Anda ingin menghindari penyimpanan seluruh payload di memori.
Bagaimana Go menangani field JSON yang tidak ada dalam payload?
Field JSON yang tidak ada membuat field Go struct terkait berada pada nilai zero-nya: "" untuk string, 0 untuk angka, false untuk bool, nil untuk pointer dan slice. Jika Anda perlu membedakan antara "field tidak ada" dan "field ada tetapi bernilai zero", gunakan tipe pointer seperti *int atau *string. Pointer nil berarti field tidak ada; pointer bukan-nil dengan nilai zero berarti field secara eksplisit diset ke 0 atau "".
Mengapa field Go struct harus diekspor (diawali huruf kapital) untuk JSON?
Paket encoding/json menggunakan reflection untuk mengakses field struct, dan aturan reflection Go hanya mengizinkan akses ke field yang diekspor (diawali huruf kapital). Jika sebuah field dimulai dengan huruf kecil, encoding/json tidak dapat melihatnya dan akan melewatinya secara diam-diam saat marshaling maupun unmarshaling. Gunakan struct tag json untuk memetakan field PascalCase yang diekspor ke kunci JSON huruf kecil.
Bagaimana cara menangani kunci JSON snake_case di Go?
Tambahkan struct tag json dengan nama kunci JSON yang tepat. Misalnya, field JSON "user_name" dipetakan ke field Go UserName dengan tag `json:"user_name"`. Generator menangani ini secara otomatis. Tidak ada opsi global di encoding/json untuk menetapkan kebijakan penamaan; setiap field harus mendeklarasikan tag-nya sendiri.
Bisakah saya mengonversi JSON dengan nilai null ke Go?
Ya. Nilai null dalam JSON dipetakan ke tipe pointer di Go. Field seperti "age": null menjadi Age *int `json:"age"`. Ketika nilai JSON adalah null, pointer Go adalah nil. Ketika memiliki nilai, Go mengalokasikan int dan pointer mereferensikannya. Untuk field yang selalu nullable, menggunakan pointer adalah pendekatan idiomatik di Go.
Apa yang terjadi jika JSON mengandung angka yang lebih besar dari yang bisa ditampung oleh int Go?
Tipe int Go bergantung pada platform (32-bit pada sistem 32-bit, 64-bit pada sistem 64-bit). Untuk angka besar seperti timestamp JavaScript atau ID basis data, gunakan int64 secara eksplisit. Jika angka JSON memiliki angka desimal, gunakan float64. Untuk angka yang melebihi presisi float64 (misalnya, nilai finansial besar), gunakan json.Number, yang menyimpan representasi string mentah dan memungkinkan Anda mengurainya sendiri.
Apakah ada perbedaan antara alat ini dan JSON-to-Go-Struct?
Alat ini menghasilkan definisi tipe Go dengan fokus pada pola penggunaan encoding/json: struct tag yang benar, inferensi tipe yang tepat, dan penanganan struktur bersarang serta array. Alat JSON to Go Struct di situs ini berfokus pada scaffolding struct. Keduanya menghasilkan kode Go yang valid. Gunakan yang paling cocok dengan alur kerja Anda. Referensi struct tag dan tabel pemetaan tipe di halaman ini berguna terlepas dari generator mana yang Anda pilih.