Golang ve JSON Verilerle Çalışmak – Part 2

Golang Json

Golang Json

Giriş

Bir önceki yazıda bu serinin ilk yazısını anlatmıştım. Alanları atlamayı yani görmezden gelmeyi de belirtmiştim.

Bu yazı biraz devam niteliğinde olacak

Gelişme

Bu yazıda Map ve Slice kavramlarının Go programlama dilinde nasıl kullanılacağını özellikle de json işlemlerinde nasıl kullanılacağını göreceğiz.

Map ve Slice

Bir önceki yazıda structları kullanmıştık. Burada basit birkaç kod örneği ile map ve slice kavramlarını görüntüleyebiliriz.

Map

func main() {

    musteri := map[string]interface{}{
        "Adi":  "Ali",
        "Yasi": 24,
    }

    json_bytelar, _ := json.Marshal(musteri)

    fmt.Printf("%s ", json_bytelar)
}

Yukarıda çalışan kodun yine json türünden veri döndürdüğünü bilelim. Çünkü slice kavramı biraz daha farklı.

Slice

func main() {

    musteri := []string{"Ali", "24"}

    json_bytelar, _ := json.Marshal(musteri)

    fmt.Printf("%s ", json_bytelar)
}

Söylediğim gibi slicelar türden de gördüğünüz üzere array tipinde data döner. Bu da key~value şeklinde erişim imkanı vermez ancak index tabanlı erişim imkanına sahip olursunuz.

Bu her iki yapı da kullanılabilir yani geçerli. Fakat önerilen şey bu iki metodun yerine structların tercih edilmesi. Hem hazırda bir yapı ve o yapının formatının ne olduğuna dair bilgi olacak hem de hata yapma riskiniz en aza indirgenmiş olacak.

JSON Veriyi Parse Etmek

Bu serinin ilk adımlarında bir json veri nasıl üretilir bunları gördük. Ancak json verinin üretilmesi kadar bu verinin parse edilmesi de önemlidir. Şimdi bu verinin nasıl parse edileceğini görelim.

Structları Kullanmak

Aslında bunun için en uygun yöntem yine structları kullanmak. Elimizde var olan json veriyi, oluşturulan struct içerisine aktararak parse etme işlemini yapabiliriz.

Burada önemli olan konu, alan == alan bütünlüğünü sağlayabilmemiz. Basit olsun diye JSON verileri içine dolduracağımız şöyle bir structa sahip olalım:

type Kisiler struct {
    Adi     string   <code>{{EJS0}}</code>
    Soyadi  string   <code>{{EJS1}}</code>
}

Bu yapının tutacağı veri belli. Hemen bu yapıya uygun şekilde mock object oluşturalım. Örnek verimiz şöyle olsun:

json_bytelar := []byte(<code>{{EJS2}}</code>)

Bu verileri, önceden oluşturduğumuz structa şöyle bind ederiz:

kisi := Kisiler{}
err := json.Unmarshal(json_bytelar, &kisi)
if err != nil {
    panic(err)
}

fmt.Println(kisi.Adi, kisi.Soyadi)

Böylelikle alanlara aktarımı da sağlamış oluyoruz.

Dosyadan JSON Okuma ve Dosyaya JSON Veri Yazma

Buraya kadar anlatılanlar kadar önemli bir husus ise bu verilerin dosyaya yazılması ve hatta dosyadan okunuyor olması. Günümüzde JSON API’ların önemi de biliniyor.

Çok fazla olmasa da Github üzerinde bazı projelerde API isteğine dönen verinin önce sisteme kaydedildiğini daha sonra oradan okunduğunu gördüm. Böyle bir durumla karşılaşırsak ne yaparız?

Dosyadan Veri Okumak

Öncelikle os modülünü import edelim. Daha sonra örnek bir json dosyası oluşturalım. Ben kisi.json diyorum bu dosyaya. json list olsun ki farklı indexlere nasıl erişiyoruz görelim:

[
    {
        "Adi": "Nikola",
        "Soyadi": "Tesla"
    },
    {
        "Adi": "Isaac",
        "Soyadi": "Newton"
    }
]

Ardından gelelim bu dosyayı parse etme işlemine

package main

import (
    "encoding/json"
    "fmt"
    "os"
)

func main() {

    dosyaOku, _ := os.Open("kisi.json")
    var kisi []map[string]interface{}
    json.NewDecoder(dosyaOku).Decode(&kisi)

    fmt.Println(kisi[0]["Adi"])
}

Eğer index ve key adını vermezseniz tüm listeyi görürsünüz.

Dosyaya Veri Yazmak

Dosyaya veri yazma işini yaparken genellikle structlar kullanılıyor ancak bunun yerine interface mapler de kullanılabilir. Aşağıdaki örnekte yine Kisiler üzerinden gittik. Ayrıca structın tepesine yorum bıraktım buna dikkat edelim. Go programlama dili struct adıyla başlayan yorum satırlarının yapı üzerinde kullanılmasını öneriyor.

package main

import (
    "encoding/json"
    "os"
)

// Kisiler structı
type Kisiler struct {
    Adi    string
    Soyadi string
}

func main() {

    kisi := Kisiler{
        Adi:    "Nikola",
        Soyadi: "Tesla",
    }

    dosyayaYaz, _ := os.Create("kisi.json")
    json.NewEncoder(dosyayaYaz).Encode(kisi)
}

Çıktısı şöyle olacaktır:

{
    "Adi":"Nikola",
    "Soyadi":"Tesla"
}

Evet bu yazı dizisini bitirmiş bulunmaktayım. Umarım yararlı olmuştur.