CodeBlanks Logo Icon CodeBlanks

Marshal ve Unmarshal

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

main.go
package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
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

Soru
var s Sepet
err := json.Unmarshal(veri, ____)
Cevap
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

Orta seviye bölümündeki tüm dersler