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.
Ş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.
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.
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
5. Sonraki ekranlarda da seçimlerinizi istediğiniz gibi yapabilirsiniz. Aşağıdaki görseller de devamını görebilirsiniz.
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.
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.
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:
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 :
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.
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ı :
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 :
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.
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 :
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.
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..
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.
Merhaba, aynı yol ile imaja ait bilgiyi de alabilirsiniz. Bu bilgi imajın linki olabilir örneğin.
Merhaba Mustafa, mesela yemek listesi yazsak tarihleri olan. güncel tarih ile eşleştirip nasıl veri çekebiliriz.
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.
Teşekkürler, yararlı olmuş.
Çok güzel bir makale olmuş elinize sağlık Volley kütüphanesi ile anlatımı da olacak mı acaba ?
Merhaba Yusuf,
Volley ile herhangi bir yazı yazmayı düşünmüyorum. Retrofit ile olabilir ileriki tarihlerde.