Encoder ve Decoder
- Go kursu
- Orta seviye
- Ders 62/80
- 4 dk
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ınSı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
package main
import (
"encoding/json"
"fmt"
"io"
"strings"
)
func main() {
// buraya yaz
}Örnek çözüm
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
if err := json.NewDecoder(r.Body).____(&istek); err != nil {
return err
}
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ı |