Marshal ve Unmarshal
- Go kursu
- Orta seviye
- Ders 61/80
- 4 dk
Marshal ile JSON üretmeyi, Unmarshal ile çözmayı öğrenirsin.
Unmarshal
json.Unmarshal(veri, &hedef) JSON baytlarını bir Go değerine çözer. Hedef işaretçi olmalıdır; aksi halde paket değeri dolduramaz.
var u Urun
err := json.Unmarshal([]byte(`{"ad":"Kalem","fiyat":12.5}`), &u)
if err != nil {
return err
}
fmt.Println(u.Ad, u.Fiyat)Tür uyuşmazlığı (ör. sayı beklenen alanda metin) *json.UnmarshalTypeError döndürür; bozuk JSON *json.SyntaxError.
Eksik alanı ayırt etmek
"adet":0 ile adetin hiç gönderilmemesi aynı görünür. Farkı anlamak için işaretçi alan kullanılır:
type Guncelle struct {
Adet *int `json:"adet"`
}
// {"adet":0} → Adet != nil, *Adet == 0
// {} → Adet == nil (gönderilmedi)PATCH tipi API'lerde bu ayrım önemlidir.
Uygulama JSON çöz
type Siparis struct { ID int `json:"id"`; Urunler []string `json:"urunler"` } tanımla. {"id":7,"urunler":["kalem","defter"]} metnini çöz ve ID ile ürün sayısını yazdır.
Başlangıç kodu
package main
import (
"encoding/json"
"fmt"
)
func main() {
// buraya yaz
}Örnek çözüm
package main
import (
"encoding/json"
"fmt"
)
type Siparis struct {
ID int `json:"id"`
Urunler []string `json:"urunler"`
}
func main() {
veri := []byte(`{"id":7,"urunler":["kalem","defter"]}`)
var s Siparis
if err := json.Unmarshal(veri, &s); err != nil {
fmt.Println(err)
return
}
fmt.Println(s.ID, len(s.Urunler))
}Beklenen çıktı
7 2
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 JSON'da olmayan bir struct alanına Unmarshal sonrası ne olur?
- Silinir
- Önceki değerini (çoğunlukla sıfır değerini) korur Doğru cevap
- Hata döner
- nil olur
Açıklama: Unmarshal yalnızca JSON'da bulunan alanlara dokunur; bu sayede varsayılan değerli bir struct'a JSON çözülerek yalnızca verilen alanlar değiştirilebilir.
2 İşaretçi ver
var s Sepet
err := json.Unmarshal(veri, ____)
var s Sepet
err := json.Unmarshal(veri, &s)
Açıklama: Unmarshal hedefi doldurabilmek için işaretçiye ihtiyaç duyar.
3 Hata türü
| Kavram | Anlamı |
|---|---|
Bozuk JSON |
*json.SyntaxError |
Yanlış tür |
*json.UnmarshalTypeError |
İşaretçi değil |
*json.InvalidUnmarshalError |
Eksik alan |
Hata yok, değer korunur |