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.