JSON ke Struktur Go

Berikutnya

Tempel contoh JSON untuk memperoleh definisi struktur Go yang dapat diproses secara akurat oleh encoding/json. Setiap bidang diekspor (dengan format CamelCase), diberi tag menggunakan kunci JSON asli, diubah menjadi pointer jika nilainya bisa bernilai null, dan objek terstruktur mendapatkan deklarasi struktur tersendiri dengan nama tertentu.

Cara mengonversi JSON ke struktur Go

  1. 1

    Tempel JSON

    Satu sampel saja sudah cukup. Penggunaan beberapa sampel dapat meningkatkan akurasi inferensi tipe nullable.

  2. 2

    Pilih nama

    Untuk bidang yang diekspor, PascalCase merupakan konvensi standar dalam bahasa Go. Pilih gaya penyingkatan (`URL` vs `Url`, `ID` vs `Id`).

  3. 3

    Pilih strategi opsional

    Gunakan pointer untuk bidang yang dapat bernilai null (yang paling umum digunakan), atau tag `omitempty`.

  4. 4

    Salin Struktur-Struktur

    Satu struktur akar beserta struktur-struktur yang terletak di dalamnya. Tempelkan ke dalam file `.go`, lalu klik `go build`.

Contoh hasil eksekusi

Untuk:

{ "first_name": "Alice", "age": 30, "email": null, "tags": ["admin"] }

Hasil:

type User struct {
    FirstName string   `json:"first_name"`
    Age       int      `json:"age"`
    Email     *string  `json:"email"`
    Tags      []string `json:"tags"`
}

Pemetaan Tipe

Nilai JSON Jenis Go
string string
bilangan bulat int atau int64
nomor (desimal) float64
boolean bool
null (dengan saudara yang tidak bernilai null) *T ( pointer)
array []T
objek Struktur bernama
matriks campuran []interface{}

Penamaan idiom yang diikuti oleh generator

  • Inisial yang ditulis dengan huruf kapital: id -> ID, url -> URL, api_key -> APIKey. Hal ini sesuai dengan gaya yang direkomendasikan oleh Go (serta aturan untuk go vet/staticcheck).
  • Bidang Snake_case JSON -> PascalCase: first_name -> FirstName.
  • Akronim berupa satu kata tetap dipertahankan: IP tetap menjadi IP, dan HTTP tetap menjadi HTTP.
  • Tag JSON: json:"first_name" mempertahankan kunci asli sehingga proses pengkodean dan dekoding berjalan secara lancar.

Bidang opsional: pointer atau omitempty?

Strategi Digunakan saat
pointer (*T) Anda perlu membedakan “tidak ada” dengan “nilai nol”
omitempty Anda hanya ingin melewatkan nilai nol saat proses marshal; unMarshal akan menyimpan nilai nol untuk data yang tidak tersedia
Tidak ada Bidang tersebut selalu ada dan nilai nol memiliki makna

Secara default, generator menggunakan pointer + omitempty untuk nilai yang dianggap sebagai null; penyetelan dapat disesuaikan sesuai dengan semantik Anda.

Kesalahan Umum

  • Menggunakan int ketika nilai bilangan bulat dalam format JSON melebihi batas yang ditentukan oleh MaxInt32 pada sistem target berarsitektur 32-bit; gunakan int64 untuk nilai yang diketahui berukuran besar.
  • Penataan ulang urutan dan kehilangan urutan kunci: encoding/json menghasilkan kunci sesuai urutan deklarasi medan, bukan urutan JSON asli. Harus diurutkan secara manual jika diperlukan keluaran yang kanonik.
  • Matriks berbentuk campuran. []interface{} kehilangan keamanan tipe; pertimbangkan penggunaan tipe unifikasi dengan medan diskriminator type sebagai penggantinya.
  • Lupa mengisi kolom omitempty pada bidang opsional. Jika tidak diisi, kolom opsional akan diserialisasi sebagai "foo": null, bukan diabaikan.

Pertanyaan yang Sering Diajukan

Gunakan pointer ketika perlu membedakan kondisi “field absen” dengan “field bernilai nol”. Gunakan omitempty jika nilai nol bukan nilai bisnis yang sah ("", 0, dan false selalu berarti “lompati nilai ini”). Banyak tim memilih salah satu kode tersebut dan menerapkannya secara konsisten di seluruh basis kode.

Setiap objek terstruktur menjadi deklarasi struktur bernama yang terpisah (misalnya UserAddress). Tipe hanya diintegrasikan secara langsung jika struktur terstruktur tersebut sangat kecil dan digunakan sekali; jika tidak, Anda akan mendapatkan tipe yang bersih dan dapat digunakan kembali.

Ya. id berubah menjadi ID, url menjadi URL, dan api_key menjadi APIKey. Inilah yang diharapkan oleh go vet serta yang direkomendasikan oleh sebagian besar panduan gaya penulisan Go.

Generator menghasilkan struktur sederhana dengan tag standar json:. Untuk implementasi khusus UnmarshalJSON (misalnya untuk tanggal dalam format non-ISO), tambahkan tag tersebut secara manual setelah proses generasi selesai.

Alat Terkait

Alat ini tersedia dalam bahasa lain