CodeBlanks Logo Icon CodeBlanks

Encoder ve Decoder

json.NewEncoder ve json.NewDecoder öğrenirsin.

Encoder ve Decoder

json.NewEncoder(w) ve json.NewDecoder(r) doğrudan Writer/Reader ile çalışır; ara []byte gerekmez. HTTP'de gövdeyi okumak ve yanıt yazmak için standart yoldur:

var istek YeniUrun
if err := json.NewDecoder(r.Body).Decode(&istek); err != nil {
    http.Error(w, "geçersiz JSON", http.StatusBadRequest)
    return
}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(sonuc)

Encode her değerin sonuna satır sonu ekler.

Ayarlar

Decoder ve Encoder davranışı ayarlanabilir:

dec := json.NewDecoder(r)
dec.DisallowUnknownFields()  // bilinmeyen anahtar → hata
dec.UseNumber()              // sayıları float64 yerine json.Number

enc := json.NewEncoder(os.Stdout)
enc.SetIndent("", "  ")      // okunur çıktı
enc.SetEscapeHTML(false)     // < > & kaçışlanmasın

Sıkı doğrulama isteyen API'lerde DisallowUnknownFields yazım hatalı alanları erken yakalar.

Uygulama NDJSON oku

strings.NewReader ile iki satırlık akış oluştur: {"ad":"a"} ve {"ad":"b"}. json.NewDecoder ile döngüde çöz, io.EOF'ta dur ve her adı yazdır.

Başlangıç kodu

main.go
package main

import (
    "encoding/json"
    "fmt"
    "io"
    "strings"
)

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
package main

import (
    "encoding/json"
    "fmt"
    "io"
    "strings"
)

func main() {
    dec := json.NewDecoder(strings.NewReader("{\"ad\":\"a\"}\n{\"ad\":\"b\"}\n"))
    for {
        var v struct {
            Ad string `json:"ad"`
        }
        if err := dec.Decode(&v); err == io.EOF {
            break
        } else if err != nil {
            fmt.Println(err)
            return
        }
        fmt.Println(v.Ad)
    }
}

Beklenen çıktı

a
b

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Satır satır JSON (NDJSON) akışını okumak için en uygunu hangisidir?

  • Döngüde dec.Decode ile her nesneyi sırayla çözmek Doğru cevap
  • Tümünü ReadAll ile okuyup Unmarshal etmek
  • strings.Split ile bölmek
  • Encoder kullanmak

Açıklama: Decoder akıştan bir sonraki tam JSON değerini okur; io.EOF gelene kadar döngüyle sabit bellekle tüm akış işlenir.

2 Gövdeyi çöz

Soru
if err := json.NewDecoder(r.Body).____(&istek); err != nil {
    return err
}
Cevap
if err := json.NewDecoder(r.Body).Decode(&istek); err != nil {
    return err
}

Açıklama: Decoder.Decode akıştaki sonraki JSON değerini hedefe çözer.

3 Araç ve kullanım

Kavram Anlamı
json.Marshal Bellekte bayt üretir
json.NewEncoder Writer'a akıtır
json.NewDecoder Reader'dan okur
SetIndent Okunur çıktı

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