Merhaba arkadaşlar bu dersimizde Android de Json nasıl parse edilir onu öğreneceğiz.Geçen dersimizde sunucuyla nasıl iletişim kurup nasıl veri alış-verişin de bulunulur ve Asynctask sınıfı nasıl kullanılır onu öğrenmiştik.Bu dersimiz o dersin devamı niteliğindedir. Bir önceki derse ulaşmak için tıklayınız.
Öncelikle JSON nedir kısada olsa onu anlatmaya çalışalım:
JSON kelime anlamı olarak JavaScript Object Notation manasına gelmektedir.
Yapı olarak XML e çok benzeyen JSON tipinin ana amacı veri alış verişi yaparken daha küçük boyutlarda veri alıp göndermektir. Ayrıca kullanımı da çok kolaydır.XML gibi her dilde kullanımı vardır.Kısaca her dilin tanıdığı ortak array diyebiliriz.
JSON ı kısaca tanıdıktan sonra Android de nasıl kullanılacağına göz atalım.Bunun için ufak bir uygulama yaptım . Uygulama üzerinden anlatacağım.
[wpdm_file id=2]
import java.util.ArrayList; import java.util.List; import org.apache.http.NameValuePair; import org.apache.http.message.BasicNameValuePair; import org.json.JSONException; import org.json.JSONObject; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.Spinner; import android.widget.TextView; import android.app.Activity; import android.app.ProgressDialog; public class MainActivity extends Activity { Spinner sp; int secilen; TextView t1,t2,t3,t4; String url = "http://www.mobilhanem.com/test/jsondeneme.php"; String veri_string; PostClass post = new PostClass(); //Post Class dan post adında nesne olusturduk.Post classın içindeki methodu kullanabilmek için @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //activity_main.xml de oluşturduğumuz textview leri koda tanıtıyoruz. t1 = (TextView)findViewById(R.id.textView2); t2 = (TextView)findViewById(R.id.textView4); t3 = (TextView)findViewById(R.id.textView6); t4 = (TextView)findViewById(R.id.textView8); //activity_main.xml de oluşturduğumuz spineri koda tanıtıyoruz. sp = (Spinner) findViewById(R.id.spinner1); //Spinera Listener ekliyoruz sp.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // TODO Auto-generated method stub secilen = arg2; //spinerdan secilen değerin sıra değerini alıyoruz. kaçıncı sırada olduğunu if(secilen!=0){ //seçilen deger ilk deger değilse yani Kişi seçiniz yazısı değilse new KisiBilgiGetir().execute();//Asynctask classı çağırıyoruz. } } @Override public void onNothingSelected(AdapterView<?> arg0) { // TODO Auto-generated method stub } }); } class KisiBilgiGetir extends AsyncTask<Void, Void, Void> { ProgressDialog pDialog; JSONObject veri_json; //JSONObject sınıfından veri_json adında obje tanımlıyoruz. protected void onPreExecute() { // Post tan önce yapılacak işlemler. ProgressDialog gösterdik. pDialog = new ProgressDialog(MainActivity.this); pDialog.setMessage("Kişi Bilgileri Getiriliyor..."); pDialog.setIndeterminate(true); pDialog.setCancelable(false); // ProgressDialog u iptal edilemez hale getirdik. pDialog.show(); } protected Void doInBackground(Void... unused) { // Arka Planda yapılacaklar. Yani Post işlemi List<NameValuePair> params = new ArrayList<NameValuePair>(); //Post edilecek değişkenleri ayarliyoruz. params.add(new BasicNameValuePair("kisi", ""+secilen)); veri_string = post.httpPost(url,"POST",params,20000); //PostClass daki httpPost metodunu çağırdık.Gelen string değerini aldık try { veri_json =new JSONObject(veri_string);//gelen veri_string değerini json arraye çeviriyoruz. //try içinde yapmak zorunlu çünkü çıkabilecek bir sorunda uygulamanın patlamaması için } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } Log.d("HTTP POST CEVAP:",""+veri_json);// gelen veriyi log tuttuk return null; } protected void onPostExecute(Void unused) { //Posttan sonra pDialog.dismiss(); //ProgresDialog u kapatıyoruz. runOnUiThread(new Runnable() { //Asynctask class içinde arayüzde değişiklik yapmak istiyorsak thread kullanmak zorundayız public void run() { String isim,yas,mail,adres; try { //try içinde yapmak zorunlu çünkü çıkabilecek bir sorunda uygulamanın patlamaması için. //veri_json arrayindeki değerleri alıyoruz. isim = veri_json.getString("isim"); yas = veri_json.getString("yas"); mail = veri_json.getString("mail"); adres = veri_json.getString("adres"); //bu aldığımız değerleri textView lere yazdırıyoruz. t1.setText(isim); t2.setText(yas); t3.setText(mail); t4.setText(adres); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); } } }
Arkadaşlar öncelikle şunu belirteyim arayüz hazırlamak için kasmadım.Dersin amacı Json öğrenmek olduğu için pek uğraşmadım.Burdaki json,sunucudan gelen Json verisi öğrenmek ve mantığını anlamak için çok basit düzeyde bir Json verisidir. İlerleyen derslerde daha karışık iç içe json verileriylede uğraşacağız ve bir Login uygulaması yapıp bu Login uygulamasını facebook login, twitter login vs geliştireceğiz.
Dersimize dönelim…Gerekli olan açıklamaları zaten kod üzerinde yaptım. Ama burda üzerinde durmamız gereken yer JSONObject sınıfıdır. Sunucudan gelen cevap string yapısındadır ve parse edilemez .Burada JSONObject classı değişken olarak aldığı string değişkenini bir json objesine dönüştürür.Bu objede getString() metodu ile istenilen değişkenin değerini döner. Dikkat etmemiz gereken yer ise bu stringin json formatında olmasıdır.Aksi takdirde hata verir.
Sunucuda çalışan PHP dosyası ise şöyle
<?php sleep(2); //Kişi bilgileri getiriliyor... yazısının daha uzun gözükmesi için if($_POST){ //Post tan geliyorsa işlem yapması için $kisi = $_POST["kisi"]; //gelen kisi variable değerini aldık Spiinerdan sectiğimiz kişi değeri if($kisi==1){ $bilgiler = array('isim' => "Taha Kırca", 'yas' => "26", 'mail' => "[email protected]", 'adres' => "Ankara"); //Json arrayi olusturduk }else{ $bilgiler = array('isim' => "Aycan Ayhan", 'yas' => "26", 'mail' => "[email protected]", 'adres' => "İstanbul"); //Json arrayi olusturduk } echo json_encode ($bilgiler); //Json arrayi encode ediyoruz. Yani $arr arrayini json arraya çeviriyoruz. } ?>
Elbette gerçek bir projede bu şekilde çalışılmaz. Güvenlik Önlemleri alınır. Gelen veriler kontrol edilip ona göre çalışılır. İlerleyen zamanlarada yapacak olduğum Login Uygulamasında bunlara dikkat ediceğiz ve gerekirse Mysql database kullanacağız.
Bu derste anlatmak istediklerim bu kadar. Anlamadığınız yer olursa çekinmeden soru sorabilirsiniz.
Bir dahaki derste Login uygulamasında lazım olacak olan SQLLite database kullanımından bahsedeceğim.Kendinize iyi bakın.
Tüm Android Ders, Proje ve Kaynak Kodlar için tıklayınız.
[wpdm_file id=2] 1
ellinize sağlık güzel bir paylaşım
Teşekkürler…
Hocam benim ;
http://192.168.2.200:5555/getJsonData.json adresinde { “outlet1” : “on” , “outlet2” : “off” } json verilerim var. Json ile bu değerleri parse edip, eğer outlet1:on ise main.xml deki 1.SwitchButtonu ON konumuna getirebilirim. Aynı zamanda switch butonlada urlye outlet1:on komutunu gönderebilmem gerekiyor.
Bu konuda yeniyim, yardımcı olabilir misiniz ?
Android kod kısmına geçmeden önce sunucudan veri alıp almadığını kontrol etmen lazım. http://www.mobilhanem.com/android-http-post-ve-asynctask-kullanimi/ bu dersimizde sunucuyla bağlantı kurmayı göstermiştim. Bu kod örneğini indirip linki değiştirip dene bakalım veri alabiliyormusun.
Android kod kısmına geçmeden önce sunucudan veri alıp almadığını kontrol etmen lazım. http://www.mobilhanem.com/android-http-post-ve-asynctask-kullanimi/ bu dersimizde sunucuyla bağlantı kurmayı göstermiştim. Bu dersteki kaynak kodu indirip post linki değiştirip kendi linkini dene bakalım veri alabiliyormusun.
Denedim fakat olmadı. Sunucudaki Json dosysının type kısmı “application/json” olarak ayarlı. Htmlde jquery ile yapiyorum ama android webviewde çok uğrastırıyor ve veri çekerken kasılıyor vede sağlıklı olmuyor.
Benim sana tavsiyem localde degilde gercek bir sunucuda bu islemleri php ile halletmen.sen androidden switchi degistrdiginde telefondan veriyi post edeceksin php ile aldigin post degiskenine gore switch i on veya off olarak degerini degistrecksn.Ama bunlardan önce ilk olarak sunucudan veri alman lazim. Bu arada manifest dosyasinda internet icin gerekli izini vermeyi unutma.
Talha hocam, olay farklı biraz 🙁 Size özelden olayı detaylı bir şekilde anlatabilirsem o zaman daha iyi yardımcı olacağınıza inanıyorum. Çok acil yardıma ihtiyacım var, yabancı kaynaklarda bulamadım 🙁
ömer android ile otomasyon yapmak istiyorsun anlıyorum seni. ben bi tane yaptım akıllı ev otomasyonu yardımcı olurum sana 😀
Akıllı ev otomasyonunu tamamladım. Android kısmı kalmıştı, onuda Httpget yöntemiyle halletim. Ama istediğim birşey daha var, jsonları parse ederken sadece Activity aktif olduğunda değil, sayfa aktif olduktan sonrada sürekli parse etmesini istiyorum. Bunu yapmak mümkünmüdür ??
taha bey, bu program üzerinden şifre değiştirmeyide gösterebilirmisiniz.
iyi çalışmalar
jsondeneme.php dosyasını asset klasörüne atıp çağırmayı nasıl yapabilirim
Sorunu tam olarak anlayamadım.Burda bahsettiğin assets klasörü android
assets klasörü ise böyle bir şey mümkün değil.Php dosyaları sadece
sunucu üzerinde çalışır yada localinine kuracağın sunucular üzerinde
çalısır.(xamp-wamp vs…)
Sorunu tam olarak anlayamadım.Burda bahsettiğin assets klasörü android assets klasörü ise böyle bir şey mümkün değil.Php dosyaları sadece sunucu üzerinde çalışır yada localinine kuracağın sunucular üzerinde çalısır.(xamp-wamp vs..)
taha abi ben kendi sitemi yazıyorum kendi sitemde senin phpkodlarını kullanıyorum ama hata veriyor
Kendi siteni yazmaktan kastın nedir? Kendi sunucundan cevap mı gelmiyor? Sunucudan gelen cevabı loglatırsan ve uygulama crash oldugunda ki logları paylasırsan yardımcı olalım.
abi şimdi ben bu siteyi kendi uygulamamda yazınca sorun vermiyor(http://www.mobilhanem.com/test/jsondeneme.php) ama bu siteyi yazınca üstteki hatayı veriyor (http://tumblr.byethost7.com/index.php) ve logları nasıl atacagımıda bilmiyorum 🙁
İyide sen o sitede gerekli PHP dosyalarını hazırladın mı?
Evet Sizin php kodlarınızı php dosyaya yazıp sunucuya attım ama bi türlü çalışmadı
Peki bu dosyaya hangi linkten ulaşıyorsun?
aynı sorunu bende yaşadım az önce sebeb php4 bnm serverim json php 4 den sonra gelen bi özellik galiba ona yorumluyorum sadece :S
Bu uygulamayı kendi wamp serverım da deniyorum, ancak hata alıyorum.
String url = “http://www.mobilhanem.com/test/jsondeneme.php”;
bu şekilde url yi değiştirdim.
String url = “http://10.0.3.2/ikinci.php”;
http://www.mobilhanem.com/android-http-post-ve-asynctask-kullanimi/
dersinde herhangi bir hata vermemişti.
Aldığınız hata nedir??
İyi günler. PostClass post=new PostClass(); burdaki PostClass kırmızı renkte hata veriyor. Bu sınıfı kendiniz mi oluşturdunuz ne yapabiliriz yardımcı olur musunuz
Bu sınıfı kendin oluşturacaksın ve ya burdaki kaynak kodlardakini projene dahil edeceksin.
İyi gunler yaptıklarınızı birebir uyguladım php dosyasını da oluşturdum hata yok ekran geliyor ama işlem yapılmıyor. Spinnerın içini doldurma işlemi yapmayacak mıyız acaba
Sunucudan veri geliyor mu ? Debug ettiğinde verinin geldiğine emin oluyor musun ?
Hayır çalıstırdıgımda veri gelmıyor spinner ve textviewler bıraktıgım gıbı duruyor sebebi ne olabilir
Selamlar, öncelikle guzel bir makale olmus elinize saglik. Benim sorum php degilde aspx sayfada parse demezmiyiz?
Simdiden tesekkurler
Aspx de kullanabilirsin. Server tarafında ne kullanacağın sana kalmış.
Teşekkürler, hocam
Hocam merhabalar php yerine aspx sayfa kullansak olurmu ?
Merhaba hocam, öncelikle makeleniz çok yararlı olmuş teşekkür ederiz. Ben burada anlattıklarını bir uygulamamda kullanıyorum. Uygulamada veri tabanında bir veya birden çok veri çekiyorum ve bunları listView’e yazdırıyorum. Bunu nasıl yapabilirim hocam. Tek veriyi çekiyorum sorun yok ama php ile 1den fazla veriyi çekince hata veriyor ayrıca android kodlarında da düzenleme yapılması gerekiyor. Yardımcı olursanız çok sevinirim hocam teşekkürler.
Bunu sorgulama yaptırmadan direkt sayfa açılır açılmaz nasıl gösterebiliriz?Teşekkürler