Android’te JSON Veri İle Çalışmak


Merhaba, bu yazımda Android’te JSON Veri ile çalışmayı anlatacağım. Temelde aşağıdaki sorularınıza cevap bulabileceğinizi ümit ediyorum.

  • Android’te JSON veri internetten nasıl çekilir?
  • JSON veri nasıl ayrıştırılır veya çözümlenir(ingilizcede parse diye geçer duymuşsunuzdur)?
  • Ayrıştırılan JSON veri bir listede nasıl gösterilir?
  • AsyncTask nasıl çalışır?

Evet temelde bu dört ana soruya bu yazım ile rahatlıkla cevap bulabileceksiniz. Neyse bu kadar giriş yeter artık konumuza geçip ardından kod yazmaya başlayalım!

JSON Veri Nedir?

JSON un açılımı JavaScript Object Notation dır. JSON bir veri depolama ve değişim formatıdır. XML veri formatına göre kullanması, yazması ve anlaması daha kolaydır.

NOT: Başka bir yazımda Android’te XML Veri ile Çalışmak konusunu da anlatacağım.

JSON veri formatı için ön bilgi adına Türkçe kaynak arıyorsanız şuna göz atabilirsiniz.

Uygulamalı Örnek İçin JSON Verimiz

Her zaman olduğu gibi konuyu uygulamalı bir örnek ile daha anlaşılır kılmaya çalışacağım. Örneğimizde şuradaki JSON veriyi örnek amaçlı kullanacağız.

Öncelikle verimizi inceleyelim. Url deki veriye bakarsanız şöyle biraz karmaşık bir veri görürsünüz.

Android te JSON Veriyle Çalışmak - JSON Veri

Şimdi bu veriyi biraz daha anlaşılır ve okunaklı hale getirelim. JSON veri ile çalışırken neredeyse her zaman kullandığım JSON Editor Chrome eklentisini size de tavsiye ederim(Ayrıca direk olarak web sitesini de kullanabilirsiniz, keyfinize kalmış).

Eklentiyi kurup açtıktan sonra veya JSON Editor ün sitesine gittikten sonra soldaki kısma verimizi kopyalayıp yapıştırın ve orta kısımdaki sağ yöne bakan ok a tıklayın, ayrıca sol üstte bulunan ilk ikona tıklayın, bu şekilde veri daha okunaklı bir hale getirilip soldaki ve sağdaki kısımda gösterilecektir. Sağdaki kısmın üst barındaki okları kullanarak verideki nesne ve dizileri açabilir veya kapatabilirsiniz.

Android te JSON Veriyle Çalışmak - JSON Veri

Ekran görüntüsünden de gördüğünüz gibi verimiz bir tane 17 elemanlı JSON dizisinden(JSON Array) oluşmakta. Bu dizimizin altında ise 17 tane JSON nesnesi(JSON Object) bulunmakta.

Artık uygulamalı örneğimize geçebiliriz.

Uygulamalı Örnek

NOT : Bu uygulama örneği Android Studio 2.1.1 sürümü kullanılarak hazırlanmış ve Android 6.0 versiyonuna sahip bir Nexus 5 emülatör ile test edilmiştir. Uygulama örneğine ait kaynak kodu yazının sonunda indirebilirsiniz.

1. Android Studio‘yu açın.
 NOT : DAHA ÖNCE BİRÇOK KEZ YENİ ANDROID PROJESİ OLUŞTURDUK. BU YÜZDEN YENİ PROJE OLUŞTURMA ÜSTÜNDE PEK DURMAYACAĞIM.

2. Start a new Android Studio project seçeneği ile yeni bir proje başlatın.
3. Application name, Company Domain, Package name, yani uygulama adı, domain, paket adı gibi değerleri istediğiniz gibi doldurun. Benim kullandıklarım aşağıdaki görselde verilmiştir.

Android te JSON Veriyle Çalışmak - Proje Oluşturma

4. Minimum SDK yani destekleyebileceğiniz en eski Android Sürümü için Api Level 14 ü seçmenizi öneririm. Play Store u ziyaret eden cihazların neredeyse tamamı(şuan için 97.4% ü) artık 4.0 üzeri Android sürümü kullanmaktadır. Yine de siz bilirsiniz :)

Android te JSON Veriyle Çalışmak - Minimum SDK

5. Sonraki ekranlarda da seçimlerinizi istediğiniz gibi yapabilirsiniz. Aşağıdaki görseller de devamını görebilirsiniz.

Android te JSON Veriyle Çalışmak - Aktivite Eklemek

Android te JSON Veriyle Çalışmak - Aktiviteyi Özelleştirme

6. Şimdi Android Studio projeyi oluşturup açacaktır. Proje açıldıktan sonra menüden Tools > Android > AVD Manager ile AVD Manager i açıp uygun bir emülatörü başlatın.

7. Emülatör açıldıktan sonra uygulamayı menüden Run > Run app ile veya Shift + F10 kısayolu ile en az bir kez çalıştırıp herhangi bir problem olmadığını görün.

Android te JSON Veriyle Çalışmak - Projeyi Çalıştırma

Evet, sıkıcı adımlar bittiğine göre artık gerçekten iş yapabiliriz! Hadi Başlayalım!

LogCat Mesajlarımız – Timber Kütüphanesi

Hemen hemen bütün projelerimde kullandığım Timber kütüphanesi Android’teki Log class i üzerine kurulmuş geliştirilebilen bir api ye sahip bir kütüphanedir. En önemli özelliği log a bıraktığınız mesajların sadece uygulamanın debug versiyonlarında bırakıldığıdır. Yani release versiyonlara ait apk lerde log a mesajlar bırakmaz. Yani diyelim ki büyük bir proje üzerinde çalışıyorsunuz, yayından hemen önce log mesajlarını kaldırmanız veya yayın apk sinde mesajların bırakılmamasını sağlamak performans açısından doğru bir adım olacaktır. Ancak bu log a bıraktığdınız mesajların miktarına göre zaman alıcı olabilir. Timber ile ta baştan bu durumu ele almış ve halletmiş oluyorsunuz. Bu nedenle ve de log mesajları oluşturmak adına daha kullanışlı bulduğum için kullanıyorum. Uygulama örneğimizde kullanırken tam olarak neyden bahsettiğimi siz de hem görecek hem deneyimleyeceksiniz.

Timber kütüphanesini projemize ekleyerek devam edelim.

8. app modülüne ait build.gradle gradle dosyasını açıp dependencies bölümüne şu satırı :

ekleyin ve sol üstte çıkacak olan Sync Now seçeneğine tıklayarak projeyi gradle dosyasına göre senkronize edin.

app modülüne ait build.gradle gradle dosyamızın son durumu :

9. MyApplication.java adında bir sınıf oluşturun ve Application sınıfını extend edin. Daha sonra Timber i kullanmamız için gerekli olan ayarları yapacağız. Aşağıda görülen TIMBER SETUP bölümünü kodunuza ekleyin.

MyApplication.java sınıfının son durumu şöyle olmalıdır :

Projemizin bu yeni oluşturduğumuz Application sınıfını kullanması için ayrıca AndroidManifest.xml dosyamızda belirtmemiz gerekir. Bunun için AndroidManifest.xml dosyasını açın ve application tagının başlangıcına şu satırı ekleyin:

AndroidManifest.xml dosyamızın son durumu şöyle olmalıdır:

Evet artık projemizde Timber kütüphanesini sorunsuzca kullanabiliriz. Test için MainActivity.java dosyasını açın ve şu satırı onCreate metoduna ekleyin:

Uygulamayı çalıştırın ve Logcat penceresinden yazdırılan mesajları izleyin. Görseldeki gibi bir satır görmelisiniz.

Android te JSON Veriyle Çalışmak - Timber LogCat - 1

JSON Verinin İnternetten İndirilmesi


JSON verimizi kullanabilmemiz için öncelikle internetten indirmemiz gerek. Bunun için kendi indirme kodumuzu yazabiliriz, veya tamamen HTTP istekleri üzerine yoğunlaşmış bir kütüphaneyi de kullanabiliriz. Bu dersimde JSON veriyi Square tarafından yazılmış OkHttp kütüphanesi ile indireceğiz.

OkHttp Kütüphanesi


OkHttp bir HTTP istemcisidir. Tamamen HTTP istekleri üzerine yoğunlaşılmış ve bu konuda son derece iyi geliştirilmiştir. HTTP isteklerinizi daha verimli bir şekilde yapmanıza olanak sağlar. Uygulamanızda yüklemelerin daha hızlı olması ve bant genişliğinden tasarrufu konularında da yararları olduğu söylenmektedir. Daha fazla bilgi için şurayı ziyaret edin.

10. OkHttp kütüphanesini projemize ekleyelim. app modülüne ait build.gradle gradle dosyasını açın. Ve şu satırı dependencies bölümüne ekleyin. Sağ üstte çıkacak olan Sync Now a tıklayarak projenizi gradle dosyasına göre senkronize edin.

Son durum şöyle olmalı:

Böylelikle kütüphaneyi projemize eklemiş olduk.

11. İnternetten veri indireceğimize göre uygulamamızın internete erişim izni olması gerekir. AndroidManifest.xml dosyasını açarak internet iznini ekleyin :

Son durum şöyle olmalı:

12. İndirme bir ağ işlemidir, uzun sürebilir ve arayüzü yorar. Direk olarak UI thread te yapmaya çalışsanız da hata alırsınız. Bu nedenlerle indirme işlemini arkaplanda yapmamız gerekir. Bunun için AsyncTask sınıfını kullanacağız. MainActivity.java sınıfını açın ve aşağıda verdiğim JSON veriyi internetten arkaplanda indirmekten sorumlu DownloadJSON AsyncTask sınıfımızı ekleyin.

NOT : TÜM KOD BLOKLARINDA ÇOĞU NOKTADA EKLEDİĞİM AÇIKLAMALAR OLACAKTIR. BUNLAR DAHA DÜZGÜN VE ANLAŞILIR BİR KOD YAZMAK İÇİN EKLENMİŞTİR. LÜTFEN AÇIKLAMALARI OKUMAYI VE KULLANMAYI İHMAL ETMEYİN.

MainActivity ‘nin onCreate metodu içinde eklediğimiz bu arkaplan işçisi sınıfımızı aşağıdaki satır ile çağırın.

Dikkat ederseniz DownloadJSON sınıfının tüm metodlarına Logcat ‘e basılmak üzere mesajlar ekledim. Bunları uygulamayı çalıştırırken, test ederken Logcat üzerinden daha rahat takip için ekledim.

Şimdi uygulamayı çalışıtırın. Logcat penceresinde şöyle mesajlar görmelisiniz:

Android te JSON Veriyle Çalışmak - LogCat 2

MainActivity sınıfının son durumu şöyle olmalıdır :

Evet herşey yolunda olduğuna göre artık asıl indirmeyi yapacak kodumuzu yazabiliriz.

13. Öncelikle JSON veriyi indireceğimiz adresimizi tanımlayalım. Şu satır ile MainActivity sınıfında adresi onCreate metodu öncesinde tanımlayın.

Daha öncede söylediğim gibi indirme işini OkHttp kütüphanesi aracılığıyla yapacağız. Bunun için öncelikle bir OkHttpClient örneği(instance) tanımlamalıyız. JSON_URL değişkeninin altına şu satırı ekleyin.

İndirmeyi yapacak kodumuzu bir metod olarak ayrıca tanımlayalım, istediğimiz yerden daha sonra çağırırız. Şu metodu MainActivity sınıfına ekleyin.

Bu metodumuzu DownloadJSON AsyncTask sınıfımızdaki doInBackground metodu içerisinden şöyle çağırıp JSON verimizi alacağız.

Yukarıdaki kodda gördüğünüz gibi öncelikle verimizi tutacağımız bir String değişkeni tanımladım > jsonData. Daha sonra bir önceki adımda tanımladığımız indirme işini yapan metodumuzu > run çağırdım. Metodumuz IOException verebileceği için çağırırken try-catch bloğu içine aldım ki sıkıntı çıkarsa yakalayalım, uygulama sistem tarafından kapatılmaya zorlanmasın. Hemen ardından yine tamamen test ve gözlem amaçlı Logcat ‘e verimizi bastım.

Şimdi uygulamayı çalıştırıp Logcat penceresini gözlemleyin. JSON verimizi göreceksiniz :

Android te JSON Veriyle Çalışmak - Logcat - 3

JSON verimizi başarılı bir şekilde indirdiğimize göre artık ayrıştırma, çözümleme (parse etme) adımına geçebiliriz.

JSON Verinin Ayrıştırılması ve Nesnelere Dönüştürülmesi

14. JSON veriyi uygulamamızda kullanabilmemiz için ayrıştırmalı ve JAVA nesnelerine dönüştürmeliyiz.

JSON veriyi ayrıştırmak için pratikte yine popüler olan bir kütüphaneyi kullanacağız : Gson kütüphanesi.

Gson kütüphanesi google tarafından yazılmıştır. Gson kütüphanesi :

  • Java nesnelerini JSON a çevirebilir
  • JSON veriyi java nesnelerine çevirebilir

Gson hakkında daha fazla bilgi için github sayfasını ziyaret edebilirsiniz.

Gson kütüphanesini projemize eklemek için gradle i kullanacağız. app modülüne ait gradle dosyası build.gradle açın ve dependencies bölümüne şunu ekleyin :

NOT : Gson kütüphanesinin github sayfasında kütüphanenin son versiyon numarasına ulaşamayabilirsiniz. Bunun için isterseniz projenin Maven deposundaki sayfasını ziyaret edebilirsiniz.

Önceki adımlardaki gibi projeyi Sync Now a tıklayarak senkronize edin.

Şimdi yine JSON Editor eklentisini kullanarak JSON verimizi inceleyin. Göreceksiniz ki veri bir tane JSON Array (dizi) içerisinde birden fazla JSON Object ten (nesne) oluşmaktadır. Öncelikle bu nesneleri içinde tutacak olan java nesnemizi tanımlayacağız.

Android te JSON Veriyle Çalışmak - JSON Veri

Projemizin daha sistematik bir şekilde-yapıda ilerlemesi için şöyle yapalım : models adında yeni bir paket oluşturun. Paket oluşturmak için paket adına(com.androidevreni.jsontutorial) sağ tıklayın > New > Package seçenekleriyle yeni paket adını models olarak girip OK seçeneğiyle oluşturun. Bunun içine Person.java adında yeni bir sınıf oluşturun. Yani durum görseldeki gibi olmalı :

Android te JSON Veriyle Çalışmak - models package

NOT : Böyle ayrı paketler açıp kullanmanın özellikle büyük projelerde çok yararı vardır.

JSON verimizde gördüğünüz gibi her nesnenin içinde Name, City, Country adında 3 tane alan var. Bu alanları Person modelimize ekleyeceğiz. Şöyleki

  • Veride bulunan Name alanı için name string ini oluşturdum. Alan ve değişken adı farklı olduğu için de alanın adını @SerializedName("") ile değişkenin hemen öncesinde Gson kütüphanesinin bilgisi olması için ekledim. Diğer alanlar için de aynı şeyi yaptım.

NOT : Değişken adı ile alan adı nı aynı yaparsanız @SerializedName ile ayrıca belirtmenize gerek yoktur.

Person modelimizin son hali :

Modelimiz hazır olduğuna göre artık bu modele göre veriyi ayrıştırabilir ve nesnelere dönüştürebiliriz.

DownloadJSON sınıfımızın doInBackground metodu içinde veri indirildikten sonra öncelikle jsonData string imizin null olup olmadığını kontrol edeceğiz. null değilse nesnelere dönüştüreceğiz. Şöyleki:

Gördüğünüz gibi Gson kütüphanesi ve modelimizi kullanarak sadece 3 satırda verimizi nesnelere dönüştürdük. Birden fazla Person nesnemiz olduğu için nesneleri bir liste olarak aldık. Sonra da test amaçlı olarak listemizi Logcat e yazdırdık. Uygulamayı çalıştırıp Logcat e göz atın. Şöyle bir çıktı görmelisiniz :

Android te JSON Veriyle Çalışmak - Veriyi Nesnelere Dönüştürdük

MainActivity sınıfının son durumu şöyle :

JSON Verinin Listelenmesi


Evet, veriyi çözümleme adımımızda tamamlandığına göre artık verimizi listelemeye geçebiliriz.

15. Listemizi oluştururken ListView e göre performansı daha iyi olan RecyclerView i kullanacağız. RecyclerView in ListView a göre başka avantajları da var. Buradan ve şuradan detaylara göz atabilirsiniz.

app modülüne ait gradle dosyası build.gradle açın ve dependencies bölümüne şu satırı ekleyerek RecyclerView kütüphanesini ekleyin:

NOT : RecyclerView Widget Android L ile birlikte geldi. Google 5.0 altı sürümlerde de bu widget i desteklemek için destek kütüphanesi hazırlayıp yayınladı. Projemize eklediğimizde budur.

MainActivity e ait xml arayüz dosyası activity_main.xml dosyasını açın. Hello World için bulunan TextView i kaldırın ve şunları ekleyin :

activity_main.xml son durum :

Listemizde kullanmak üzere iki renk tanımlayacağız. colors.xml dosyasına şu iki renk tanımını ekleyin:

Listemizdeki itemlar/elemanlar için bir xml dosyası tanımlayalım. layout altında list_item.xml adında bir xml dosyası oluşturun. Ve şunları ekleyin :

Gördüğünüz gibi isim, şehir ve ülke için birer tane TextView kullandık.

Android te JSON Veriyle Çalışmak - List item

16. adapters adında yeni bir paket oluşturun. Ve bu paket içine PersonsAdapter adında bir sınıf oluşturarak aşağıdaki kodu ekleyin. Burada onCreateViewHolder() metodu list_item xml dosyasının listenin her bir elemanı için arayüz olarak kullanılmasını sağlıyor. onBindViewHolder() metodunda ise her bir satır için ilgili veri atanıyor.

Şimdi MainActivity.java yı açın ve aşağıdaki değişiklikleri yapın. Burada RecyclerView ayarlarını yapıyoruz. İndirmeden sonra çözümlediğimiz veri listesindeki elemanları tek tek asıl listemiz için hazırladığımız personList dizisine/listesine ekliyoruz. onPostExecute() metodu içinde ise indirme ve atama işlerimiz bittiği için RecyclerView i personsAdapter.notifyDataSetChanged(); koduyla listemizdeki verilerin değiştiği uyarısında bulunup listeyi görsel olarak güncellemesini (yeniden render etmesini) sağlıyoruz.

Şimdi uygulamayı çalıştırırısanız JSON verimizin aşağıdaki gibi listelendiğini göreceksiniz :

Android te JSON Veriyle Çalışmak - JSON Veri Listelendi

Kaynak Kod

Bu haftaki yazımın sonuna geldik. Umarım birçok insana yararı olur.

Gelecek hafta yeni bir yazıda görüşmek üzere,
Herkese İyi Çalışmalar.

Android’te RSS İle Çalışmak Konulu yazımı okumak için buraya tıklayın!

Şunlar da ilginizi çekebilir

9 yorum

  • Halit
    26 Haziran 2016 at 23:31

    Hocam çok güzel bir ders olmuş kaleminize yüreğinize sağlık böyle güzel tutorialllerin devamını bekliyoruz sizden. Takıpteyiz..

  • Ertan
    6 Temmuz 2016 at 09:57

    Elinize sağlık. oldukca güzel anlatım olmuş. Peki gelen veri içerisinde birde image varsa nasıl olacak. aynı yol ile ilerleyebilir miyiz.

    • mustafa_demir
      7 Temmuz 2016 at 15:30

      Merhaba, aynı yol ile imaja ait bilgiyi de alabilirsiniz. Bu bilgi imajın linki olabilir örneğin.

      • Onur
        24 Şubat 2017 at 20:48

        Merhaba Mustafa, mesela yemek listesi yazsak tarihleri olan. güncel tarih ile eşleştirip nasıl veri çekebiliriz.

        • Mustafa Demir
          3 Mart 2017 at 23:42

          Merhaba Onur,

          Karşıdaki api arayüzün tarihe göre veri sunacaksa sana, get isteği yaparken tarih parametresi ile birlikte istersin. Yok böyle bir imkan yoksa veya sen böyle bir imkan oluşturmayacaksan tüm listeyi çekersin sonra tarih değerlerini güncel tarih ile karşılaştırır uygun olanları alırsın. Tarihleri genelde epoch & unix time a çevirip öyle karşılaştırırız. Epoch & Unix timestamp nedir ne için kullanılabilir yazılımlarda araştırırsan yararı olacaktır.

  • ibrahim
    6 Temmuz 2016 at 21:08

    Teşekkürler, yararlı olmuş.

  • Yusuf
    10 Temmuz 2016 at 19:10

    Çok güzel bir makale olmuş elinize sağlık Volley kütüphanesi ile anlatımı da olacak mı acaba ?

    • Mustafa Demir
      3 Mart 2017 at 23:44

      Merhaba Yusuf,

      Volley ile herhangi bir yazı yazmayı düşünmüyorum. Retrofit ile olabilir ileriki tarihlerde.

LEAVE A COMMENT