CodeBlanks Logo Icon CodeBlanks

JSON ve map

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

main.go
package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    // buraya yaz
}

Örnek çözüm

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

Soru
type Mesaj struct {
    Tur  string          `json:"tur"`
    Govde json.____ `json:"govde"`
}
Cevap
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

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