JSON ve map
- Go kursu
- Orta seviye
- Ders 63/80
- 4 dk
Dinamik JSON için map[string]interface{} öğrenirsin.
JSON ve map
Yapısı önceden bilinmeyen JSON için map[string]any kullanılabilir. Çözülen değerlerin türleri sabittir: nesne → map[string]any, dizi → []any, sayı → float64, metin → string.
var m map[string]any
json.Unmarshal([]byte(`{"ad":"Ada","yas":36}`), &m)
yas := m["yas"].(float64) // int değil!Tür iddiaları her yerde gerektiği için mümkünse struct tercih edilir.
json.RawMessage
Bir alanın çözümünü sonraya bırakmak için json.RawMessage kullanılır; örneğin tur alanına göre farklı struct'a çözülen olaylar:
type Olay struct {
Tur string `json:"tur"`
Veri json.RawMessage `json:"veri"`
}
switch o.Tur {
case "siparis":
var s Siparis
json.Unmarshal(o.Veri, &s)
}Böylece hem esnek hem tür güvenli bir yapı kurulur.
Uygulama Dinamik JSON
{"ad":"Ada","diller":["go","sql"],"yas":36} metnini map[string]any'e çöz. yas'ı float64 olarak, diller'i []any olarak iddia edip yaşı int'e çevirerek ve dil sayısını yazdır.
Başlangıç kodu
package main
import (
"encoding/json"
"fmt"
)
func main() {
// buraya yaz
}Örnek çözüm
package main
import (
"encoding/json"
"fmt"
)
func main() {
var m map[string]any
if err := json.Unmarshal([]byte(`{"ad":"Ada","diller":["go","sql"],"yas":36}`), &m); err != nil {
fmt.Println(err)
return
}
yas := m["yas"].(float64)
diller := m["diller"].([]any)
fmt.Println(int(yas), len(diller))
}Beklenen çıktı
36 2
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 <code>map[string]any</code>'e çözülen <code>36</code> sayısının Go türü nedir?
- int
- int64
- string
- float64 Doğru cevap
Açıklama: JSON'da tamsayı/ondalık ayrımı yoktur; json paketi any hedefinde tüm sayıları float64 yapar. Büyük tamsayılar için Decoder.UseNumber kullanılır.
2 Sonraya bırak
type Mesaj struct {
Tur string `json:"tur"`
Govde json.____ `json:"govde"`
}
type Mesaj struct {
Tur string `json:"tur"`
Govde json.RawMessage `json:"govde"`
}
Açıklama: RawMessage alanın ham JSON baytlarını çözmeden saklar.
3 JSON → any
| Kavram | Anlamı |
|---|---|
{...} |
map[string]any |
[...] |
[]any |
36 |
float64 |
"metin" |
string |