JSON'dan Go Yapısına

Sonraki

Bir JSON örneği yapıştırın ve encoding/json ile sorunsuz ayrıştırılabilen Go yapı tanımlarını alın. Alanlar dışa aktarılır (CamelCase), orijinal JSON anahtarlarıyla etiketlenir, bir değer null olabildiğinde işaretçiye yükseltilir ve iç içe nesneler kendi adlandırılmış yapı bildirimlerini alır.

JSON, Go yapısına nasıl dönüştürülür

  1. 1

    JSON'u yapıştırın

    Tek bir örnek yeterlidir. Birden fazla örnek, null olabilen alanların çıkarımını iyileştirir.

  2. 2

    Adlandırmayı seçin

    Dışa aktarılan alanlar için PascalCase, Go'nun kuralıdır. Kısaltma biçimini seçin (`URL`'ye karşı `Url`, `ID`'ye karşı `Id`).

  3. 3

    İsteğe bağlı stratejiyi seçin

    Null olabilen alanlar için işaretçileri (en özgün yol) veya `omitempty` etiketlerini kullanın.

  4. 4

    Yapıları kopyalayın

    Bir kök yapı ve iç içe olanlar. Bir `.go` dosyasına yapıştırın ve `go build` çalıştırın.

Örnek çıktı

Şunun için:

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

Çıktı:

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

Tür eşlemesi

JSON değeri Go türü
karakter dizisi string
tam sayı int veya int64
sayı (ondalık) float64
mantıksal değer bool
null (null olmayan bir kardeşi varken) *T (işaretçi)
dizi []T
nesne Adlandırılmış yapı
karışık dizi []interface{}

Üreticinin izlediği adlandırma kalıpları

  • Kısaltmalar büyük harfle: idID, urlURL, api_keyAPIKey. Bu, Go’nun önerilen stiline ve go vet/staticcheck kurallarına uygundur.
  • snake_case JSON → PascalCase alanları: first_nameFirstName.
  • Tek kelimelik kısaltmalar korunur: IP, IP olarak kalır; HTTP, HTTP olarak kalır.
  • JSON etiketi: json:"first_name" orijinal anahtarı korur; böylece kodlama iki yönde de temiz çalışır.

İsteğe bağlı alanlar: işaretçi mi yoksa omitempty mi?

Strateji Ne zaman kullanılır
İşaretçi (*T) “Yok” ile “sıfır değer” arasında ayrım yapmanız gerekir
omitempty Marshal sırasında yalnızca sıfır değerlerini atlamak istersiniz; unmarshal, eksik değerler için sıfır saklar
Hiçbiri Alan her zaman mevcuttur ve sıfır değerler anlamlıdır

Üretici, null olarak görülen her şey için varsayılan olarak işaretçi + omitempty kullanır; anlamına göre ayarlayın.

Yaygın hatalar

  • 32 bit hedefte JSON tam sayısı MaxInt32’yi aştığında int kullanmak. Bilinen büyük değerler için int64 kullanın.
  • Geri marshal edip anahtar sırasını kaybetmek. encoding/json, anahtarları orijinal JSON sırasında değil, alan bildirim sırasına göre üretir. Kanonik bir çıktıya ihtiyacınız varsa elle sıralayın.
  • Karışık biçimli diziler. []interface{} tür güvenliğini yitirir. Bunun yerine bir type ayırıcı alanı olan birleşim türlerini düşünün.
  • İsteğe bağlı alanlarda omitempty’yi unutmak. Bu olmadan, isteğe bağlı alanlar atlanmak yerine "foo": null olarak serileştirilir.

Sık Sorulan Sorular

“Alan yok” ile “alan sıfır” durumunu ayırt etmeniz gerektiğinde işaretçi kullanın. Sıfır değeri geçerli bir iş değeri değilse omitempty kullanın ("", 0 ve false her zaman “bunu atla” anlamına gelir). Birçok ekip birini seçip tüm kod tabanında tutarlı biçimde uygular.

Her iç içe nesne, ayrı bir adlandırılmış yapı bildirimine dönüşür (örneğin UserAddress). Türler yalnızca iç içe yapı çok küçük ve bir kez kullanılıyorsa satır içine alınır; aksi hâlde temiz ve yeniden kullanılabilir türler elde edersiniz.

Evet. id, ID’ye; url, URL’ye; api_key, APIKey’e dönüşür. Bu, go vet’in beklediği ve çoğu Go stil kılavuzunun önerdiği şeydir.

Üretici, standart json: etiketleri olan basit yapılar üretir. Özel UnmarshalJSON uygulamalarını (örneğin ISO dışı biçimlerdeki tarihler için) üretimden sonra elle ekleyin.

İlgili Araçlar

Araç diğer dillerde mevcuttur