Konverter JSON ke Go Struct Gratis

Parsing JSON dan otomatis hasilkan definisi struct Go dengan nama field PascalCase dan tag json untuk integrasi yang mulus dalam kode Go Anda.

Input & keluaran

Opsi

Cara kerjanya

  1. Tempel JSON Anda: masukkan objek JSON atau struktur bersarang apa pun di kolom input.
  2. Dapatkan struct Go: definisi struct Go yang setara dengan nama field, tipe, dan tag JSON yang benar dihasilkan seketika.
  3. Salin dan gunakan: salin kode struct dan tempel di proyek Go Anda untuk mulai mendeserialisasi data JSON.

Mengapa menggunakan konverter JSON → struct Go?

Menulis struct Go secara manual untuk respons JSON kompleks itu membosankan dan rentan kesalahan, terutama saat API mengembalikan objek bersarang dalam dengan puluhan field. JSON → Go mengotomatiskan ini dengan menganalisis bentuk JSON dan menghasilkan struct Go yang diketik dengan benar dengan tag json:"…" yang sesuai, cocok dengan nama field JSON. Ini mempercepat pengembangan Go saat mengonsumsi REST API, memproses payload webhook, atau bekerja dengan sumber data JSON apa pun.

Fitur

  • Pembuatan struct bersarang: objek JSON yang bersarang dalam dikonversi menjadi definisi struct Go bersarang.
  • Inferensi tipe: string, angka, boolean, array, dan nilai null dipetakan ke tipe Go yang sesuai.
  • Tag JSON: semua field menyertakan tag struct json:"fieldName" yang cocok dengan kunci JSON asli.
  • Penanganan array: array JSON menjadi slice Go dengan tipe elemen yang benar.
  • Tipe pointer: field JSON yang dapat null direpresentasikan sebagai tipe pointer (misalnya, *string).

Pertanyaan umum

Bagaimana nilai null ditangani?

Field JSON null dikonversi menjadi tipe pointer di Go (misalnya, *string, *int), yang memungkinkan representasi baik nil maupun nilai aktual. Ini menangani field opsional atau null dalam respons API dengan benar.

Bagaimana jika JSON memiliki tipe yang tidak konsisten?

Jika field yang sama muncul dengan tipe berbeda di antara objek JSON (umum di API dunia nyata), konverter dapat menyimpulkan interface{} (any di Go modern). Tinjau field-field ini dan tambahkan asersi tipe kustom sesuai kebutuhan.

Apakah menghasilkan kode deserialisasi lengkap?

Alat menghasilkan definisi struct. Untuk deserialisasi, gunakan json.Unmarshal(data, &myStruct) atau json.NewDecoder(r.Body).Decode(&myStruct) dengan paket encoding/json standar.

Sejarah Singkat Go dan JSON

Go diumumkan di Google oleh Rob Pike, Robert Griesemer, dan Ken Thompson pada November 2009; paket encoding/json masuk ke pustaka standar sebelum Go 1.0 (Maret 2012). Parsing JSON di Go berbasis refleksi: Anda mendeklarasikan struct, menandai field dengan json:«name», dan json.Unmarshal menelusuri baik struct maupun byte. Pola tersebut terbukti sangat produktif sehingga menulis struct dengan tangan untuk API besar segera menjadi membosankan. Matt Holt membangun mholt/json-to-go sebagai alat hanya-JavaScript pada 2014 (masih dipelihara di mholt.github.io/json-to-go) menggunakan analisis JSON berbasis regex di browser. quicktype (David Siegel, 2017) menggeneralisasi ide tersebut ke 23 bahasa termasuk TypeScript, Rust, Swift, Kotlin, Python, Java. easyjson berorientasi performa (Mail.ru, 2016) melewati refleksi dengan menghasilkan kode marshalling pada waktu kompilasi, 4-5× lebih cepat dari encoding/json untuk hot path. Go 1.18 (Maret 2022) menambahkan generik, yang menyederhanakan beberapa helper marshalling tetapi tidak mengubah idiom struct tag. Go 1.21 (Agustus 2023) menambahkan paket eksperimental encoding/json/v2 (proposal masih dibahas pada 2024), yang bertujuan memperbaiki jebakan lama seperti ketidaksesuaian tipe diam-diam dan refleksi yang lambat.

Struct vs map[string]interface{}: kapan masing-masing masuk akal

  • Struct bertipe menang untuk bentuk yang diketahui. Jika Anda mengontrol API atau memiliki skema yang stabil, struct memberi Anda pemeriksaan field saat kompilasi, autocomplete IDE, dan parsing 2-3× lebih cepat. json.Unmarshal ke struct hanya menyentuh field yang dikenalinya, mengabaikan kunci JSON yang tidak dikenal secara diam-diam (kecuali Anda memanggil decoder.DisallowUnknownFields).
  • Map menang untuk JSON sembarang. map[string]interface{} (atau di Go 1.18+ map[string]any) menangani bentuk yang sangat bervariasi, payload webhook dari banyak sumber, konfigurasi plugin, dokumen MongoDB. Kompromi: setiap akses memerlukan asersi tipe (data[«age»].(float64)), dan angka diparsing ke float64 secara default, kehilangan presisi untuk integer besar.
  • Hybrid: field yang diketahui di struct, tidak dikenal di map. Gunakan json.RawMessage untuk menunda parsing atau tambahkan field catch-all Extra map[string]interface{} `json:«-,inline»` (dengan bantuan pustaka seperti go-restful). SDK Go Stripe dan Twilio menggunakan pola ini untuk respons API yang kompatibel mundur.
  • Kesenjangan performa. Hot path (mis. mem-parsing 10.000 event webhook per detik) mendapat manfaat dari marshaller yang dihasilkan: easyjson, ffjson, go-json, sonic (ByteDance, 2022, menggunakan JIT untuk menghasilkan kode mesin saat runtime, pustaka JSON tercepat di Go). Parsing generik berbasis struct mungkin menangani 100-200 MB/s; sonic menangani 1-2 GB/s.
  • Streaming untuk JSON besar. File JSON 1 GB tidak muat di memori. json.Decoder.Token() membaca token demi token. json.Decoder.More() menelusuri elemen array satu per satu. Gunakan streaming untuk file log, dataset besar, stream ND-JSON (satu objek JSON per baris, digunakan oleh OpenSearch, BigQuery, API ChatGPT).

Di mana konversi JSON-ke-Go menghemat waktu nyata

  • Integrasi REST API. Stripe, GitHub, Slack, Notion semua mengembalikan JSON bersarang dalam. Mengambil respons sampel dan menempelkannya ke json-to-go menghasilkan 80-90% dari struct akhir. Habiskan waktu yang dihemat pada 10% sisa (unmarshaller kustom untuk format waktu, semantik omitempty, field pointer opsional).
  • Handler Webhook. Payload webhook Stripe tipikal memiliki 80-200 field dengan 3-5 tingkat penyarangan. Mengetik struct Go dengan tangan memerlukan 30-60 menit; menempelkan payload sampel via json-to-go memerlukan 30 detik.
  • Parsing konfigurasi. File konfigurasi JSON (lebih disukai daripada TOML oleh AWS Lambda, Docker Compose compose.json, devcontainer.json) memetakan dengan rapi ke struct Go. encoding/json menangani baik membaca maupun menulis file dengan struct yang sama.
  • Jembatan gRPC dan Protobuf. Tipe Go protobuf yang dihasilkan menyertakan tag json. Saat melakukan transcoding antara protobuf dan JSON (gRPC-Gateway, Buf, Connect), json-to-go membantu menggambarkan sisi Go dari format wire JSON.
  • Kolom JSONB database. PostgreSQL jsonb, dokumen MongoDB, kolom JSON MySQL. Driver database/sql mengembalikan []byte yang Anda unmarshal ke struct. Generator mempercepat lintasan pertama untuk tabel schema-on-read.
  • Data fixture untuk pengujian. Respons JSON produksi nyata menjadi fixture pengujian. json-to-go memberi Anda struct untuk di-unmarshal untuk asersi. Dikombinasikan dengan direktori testdata/ (konvensi Go sejak 1.10), menjaga pengujian dekat dengan kenyataan.
  • Pipeline CSV-ke-JSON-ke-struct. Untuk tugas rekayasa data: baca CSV, marshal ke JSON untuk inspeksi, tempel ke json-to-go untuk mendapatkan struct, lalu tulis pipeline bertipe. Jauh lebih cepat daripada menebak tipe kolom dari spreadsheet.

Kesalahan umum setelah pembuatan struct

  • Melupakan penanganan time.Time. encoding/json mengasumsikan format RFC 3339 (2026-05-13T12:34:56Z). Sebagian besar API mengirimkan ini tetapi beberapa menggunakan timestamp Unix (Stripe), ISO tanpa zona waktu (API Microsoft lama), atau string kustom. Untuk non-RFC-3339, definisikan tipe kustom dengan metode UnmarshalJSON.
  • Overflow integer dengan default float64. Angka JSON yang diparsing ke interface{} menjadi float64; angka di atas 2^53 kehilangan presisi. ID pelanggan Stripe, snowflake Twitter, pengguna Discord (semua 64-bit) memerlukan json.Number atau int64 di struct Anda. Gunakan json.Decoder.UseNumber() untuk parsing aman ke interface{}.
  • Salah memahami omitempty. omitempty menghilangkan field saat marshal jika itu adalah nilai nol (string kosong, 0, pointer nil, slice/map kosong). Itu tidak berarti «opsional pada unmarshal». Field int dengan nilai 0 tidak dapat dibedakan dari yang hilang; gunakan *int jika Anda perlu tahu apakah API menghilangkan field atau mengirim nol.
  • Ketidakcocokan kapitalisasi nama field. Field Go harus diekspor (dikapitalisasi) untuk di-marshal. Nama JSON default adalah nama Go secara harfiah, jadi UserID menjadi «UserID» di JSON kecuali ditag. Generator menambahkan tag json:«userId» untuk menjembatani PascalCase Go dan camelCase JSON. Lupa tag berarti kode Anda «bekerja» dengan dirinya sendiri tetapi gagal terhadap API eksternal.
  • Penggunaan berlebihan tipe pointer. Generator kadang-kadang menggunakan *string atau *int secara default untuk keamanan. Ini membuat setiap akses memerlukan pemeriksaan nil. Jika API menjamin field selalu ada (baca dokumentasi API), gunakan tipe nilai dan lewati indireksi.
  • Tipe tidak konsisten antar respons. Beberapa API mengembalikan tags: []string{«foo»} dalam satu respons dan tags: «foo» sebagai string di yang lain. Pembuatan kode murni tidak dapat menjembatani ini. Tulis UnmarshalJSON kustom yang menangani kedua kasus, atau kembali ke interface{} dan dokumentasikan variabilitas.
  • Membuang field yang tidak dikenal secara diam-diam. Secara default, json.Unmarshal mengabaikan kunci JSON yang tidak ada di struct. Ini sering merupakan bug: API menambahkan field, kode Anda tidak tahu. Gunakan decoder.DisallowUnknownFields() dalam pengujian untuk menangkap drift; di produksi tetap permisif.

Pertanyaan yang lebih sering ditanyakan

Apa bedanya ini dengan mholt/json-to-go kanonis?

Algoritma inti yang sama: parse JSON, simpulkan tipe dari kemunculan pertama setiap field, hasilkan struct dengan field yang ditandai di antara backtick. Implementasi ini berjalan sepenuhnya di browser Anda tanpa analytics atau panggilan jaringan; yang kanonis di-host di mholt.github.io/json-to-go, juga browser-saja tetapi pada domain yang berbeda. Output harus cocok untuk ~95% input; kasus tepi (array tipe campuran, struct anonim bersarang dalam) mungkin sedikit berbeda. Jika Anda memerlukan output mholt yang tepat, gunakan itu; jika Anda memerlukan jaminan privasi bahwa JSON tidak pernah meninggalkan perangkat Anda, gunakan ini.

Mengapa beberapa field dihasilkan sebagai interface{}?

Tiga alasan umum. Pertama, literal null dalam JSON sumber: generator tidak dapat menyimpulkan tipe yang berguna dari null saja, jadi kembali ke interface{}. Ganti dengan pointer bertipe (*string, *int) setelah Anda tahu skema sebenarnya. Kedua, array tipe campuran: [1, «two», true] tidak bisa menjadi slice bertipe. Ketiga, field sepenuhnya hilang dalam sampel Anda, tempel JSON yang lebih representatif jika tersedia. Di Go 1.18+ Anda dapat mengganti interface{} dengan alias yang lebih bersih any; mereka identik di tingkat tipe.

Bisakah saya melakukan round-trip JSON melalui struct ini tanpa kehilangan data?

Umumnya ya, dengan peringatan. encoding/json mempertahankan nilai field tetapi tidak urutan field (spesifikasi JSON mengatakan urutan field tidak relevan; map Go sengaja diacak). Presisi numerik: int64 di atas 2^53 melakukan round-trip aman di Go int64, tetapi jika Anda meng-cast ke float64 atau melewati JavaScript (mis. perantara browser), Anda kehilangan digit. Field JSON tidak dikenal dihapus secara diam-diam pada unmarshal-lalu-remarshal, pertahankan dengan catch-all map[string]json.RawMessage jika kesetiaan round-trip penting.

Kapan saya harus menggunakan kode struct yang dihasilkan (easyjson, sonic) alih-alih encoding/json?

Defaultnya, encoding/json, cukup untuk 95% layanan dan dikirimkan dengan bahasa. Beralih ke easyjson atau sonic ketika Anda telah memprofilkan dan marshalling JSON muncul di flame graph CPU Anda pada >10% waktu total. Titik peralihan tipikal: layanan HTTP yang menangani ribuan permintaan per detik, agregator log yang menelan GB/jam, stream waktu nyata. Kedua alternatif mempertahankan definisi struct dan tag yang sama, jadi Anda dapat menukarnya tanpa mengubah deklarasi field.

Apakah JSON saya dikirim ke server?

Tidak. Parsing JSON dan pembuatan kode Go keduanya berjalan di JavaScript pada perangkat Anda. Buka tab Network di DevTools saat Anda menempel; Anda akan melihat nol permintaan keluar. Aman untuk respons API milik sendiri, fixture data pelanggan, payload webhook dengan PII, dan apa pun yang dilindungi NDA.