parsing nested json

Parsing Nested JSON

Kompleks JSON objeleri Parsing Nested JSON problemini de beraberinde getirmişti. Bu yazı sonrası nested for döngüleri kurup model dizilerini doldurmayı bırakacağız.

JSON objelerini daha hatasız ve az kodla parse etmemizi sağlayan Codable API kullanalım.

 

Codable Nedir?

Codable, dış kaynaklar ile iletişime geçtiğimiz verilerle (Genelde JSON) uyumlu çalışmamızı sağlayan bir API dir. Veriyi encode etmek için Encodable, decode etmek için ise Decodable protokolü kullanılır.

 

Örnek

Dışarıdan aldığımız bir JSON verisini handle edeceğiz. Örnekte local bir JSON dosyası kullanacağım.

İçeriğine bir bakalım:

 

Dosyamızda şehirler ve bilgileri var. Her şehirde bir veya birden fazla üniversite var. Bu üniversitelerin bilgileri ve her üniversitenin de yine bir veya birden çok departmanı var. Ayrıca her departmanın kendine has bilgileri de var.

Liste uzatılabilir fakat sanırım genel fikir vermek için yeterli.

 

Model Oluşturmak: Departman

Şimdi uygulamamızı açıp model sınıfını oluşturmaya başlayalım. Model oluştururken veriyi en içten en dışa doğru temsil edeceğiz. JSON dosyamızın en içinde departman bilgisi olduğundan işe Department isminde bir struct oluşturarak başlayabiliriz.

 

 

Class yerine struct seçmemin sebebi struct ın call-by-value yapısı, nispeten hızlı performansı ve initializer yazmamıza gerek duymamasıdır. Siz isterseniz Class da kullanabilirsiniz.

Burada dikkat etmemiz gereken nokta oluşturduğumuz struct ın Codable protokolünü çağırmasıdır.

Bir de yarattığımız değişken isimlerin gelen JSON verisinde hangi isme karşılık geldiğini belirtmemiz gerekiyor. Bunu da örnekte gördüğünüz gibi CodingKeys kullanarak yapıyoruz.

Eşitliğin sağ tarafında tırnak içindeki kısım gelen cevaptaki parametre ismidir. Soldaki ise projede kullandığınız isimdir. JSON dan gelen parametre ismi anlaşılması zorsa değişken isimlerini değiştirebilirsiniz. Ben genelde aynı isimleri veriyorum.

Eğer gelecek veri türünden veya isminden emin değilseniz sınıf değişkenini Optional(?) yapmanızı tavsiye ederim.

Departman bitti. Şimdi departmanın bir üstünde bulunan üniversiteye geçelim.

 

Model Oluşturmak: Üniversite

 

Üniversiteyi de aynı şekilde modelledik. Deminkinden yaptığımız tek farklı şey departman kısmı.

Her üniversitenin bir veya birden çok departmanı olabileceği için bu veriyi Department tipinde bir dizi ile temsil ediyoruz.

 

Model Oluşturmak: Şehir

 

Son olarak şehir bilgisini modelleyelim. Demin yaptıklarımıza benzer şekilde her şehrin bir veya birden çok üniversitesi olabileceği için bu veriyi University tipinde bir dizi ile temsil ediyoruz.

 

Parsing Nested JSON

Bütün modelleme işini bitirdik. Şimdi verileri tutacağımız City tipinde bir dizi oluşturalım. Hatta optional yapalımki verileri isterken cevap alamazsak nil return edelim.

 

En başta verdiğim örnek json dosyasını cities.json isminde kaydedip proje klasörüne kopyalamıştım. Eğer siz de öyle yaptıysanız verileri aşağıdaki gibi isteyebilirsiniz:

 

Elde ettiğimiz veriyi önce Data tipine dönüştürüyoruz. Daha sonra JSONDecoder kullanarak data tipindeki veriyi decode ediyoruz. Decode ederken hangi objeyi veya obje dizisini decode edeceğimizi soruyor. Bize gelen verinin en başında City tipinde bir dizi bulunduğu için buraya [City].self diyoruz. Eğer hiyerarşinin başında dizi değilde tek bir json objesi olsaydı City.self şeklinde yazacaktık.

Decode edilecek obje veya obje dizisi Decodable protokolünü conform etmesi gerekir. Biz modeli oluştururken zaten Codable protokolüne uyum sağlamıştık. Codable, Encodable ve Decodable protokollerinin ikisini de kapsıyor.

Daha sonra eğer sorun çıkmadıysa result return ediyoruz-ki bu City tipindeki dizinin doldurulmuş halidir.

Veya başarılı olmadıysa nil return ediyoruz.

 

Sonuç

 

 

Küçük bir deneme yapıp cities değişkenini doldurmaya çalıştığımızda başarılı olduğumuzu görüyoruz.

Gördüğünüz gibi kompleks json verilerini bile fazla kod yazmadan handle edebiliyoruz. Artık parse ederken saç baş yolmak yok 🙂