CodeBlanks Logo Icon CodeBlanks

Özet - encoding/json

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

main.go
package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    // buraya yaz
}

Örnek çözüm

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

Soru
b, _ := json.____(v, "", "  ")
Cevap
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

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