Özet - encoding/json
- Go kursu
- Orta seviye
- Ders 64/80
- 4 dk
Marshal, Unmarshal ve etiketleri birleştirerek bir kayıt yazarsın.
encoding/json özeti
Bellekte: json.Marshal / json.Unmarshal(&v). Akışta: json.NewEncoder(w).Encode / json.NewDecoder(r).Decode. Etiketler: json:"ad", omitempty, -. Yapısı bilinmeyen veri: map[string]any (sayılar float64) ya da json.RawMessage. Eksik ile sıfırı ayırmak için işaretçi alanlar.
Özel MarshalJSON
Para tutarını kuruş olarak tutup JSON'da ondalık metin göstermek:
type Para int64 // kuruş
func (p Para) MarshalJSON() ([]byte, error) {
return []byte(fmt.Sprintf(`"%d.%02d"`, p/100, p%100)), nil
}
json.Marshal(map[string]Para{"tutar": 1250}) // {"tutar":"12.50"}Değer alıcıyla yazılan MarshalJSON hem değer hem işaretçi için çalışır.
Uygulama Para türü
Yukarıdaki Para türünü ve MarshalJSON yöntemini yaz. map[string]Para{"tutar": 1250} değerini kodlayıp 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 Para int64
func (p Para) MarshalJSON() ([]byte, error) {
return []byte(fmt.Sprintf(`"%d.%02d"`, p/100, p%100)), nil
}
func main() {
b, err := json.Marshal(map[string]Para{"tutar": 1250})
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(b))
}Beklenen çıktı
{"tutar":"12.50"}
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Bir tür kendi JSON biçimini nasıl belirler?
- Etiketlerle yalnızca
- Mümkün değildir
- MarshalJSON / UnmarshalJSON yöntemlerini uygulayarak Doğru cevap
- String() yazarak
Açıklama: json.Marshaler ve json.Unmarshaler arayüzlerini uygulayan türler kodlamayı tamamen kendisi yönetir.
2 Okunur çıktı
b, _ := json.____(v, "", " ")
b, _ := json.MarshalIndent(v, "", " ")
Açıklama: MarshalIndent JSON'u verilen girinti ile çok satırlı yazar.
3 Grubun özeti
| Kavram | Anlamı |
|---|---|
Marshal |
Go → JSON |
Unmarshal |
JSON → Go |
omitempty |
Sıfırı atla |
MarshalJSON |
Özel biçim |