Site icon Mobilhanem

Android Http Post ve JSON Parse Etme

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' => "tahakirca@mobilhanem.com", 'adres' => "Ankara"); //Json arrayi olusturduk
	}else{
		 $bilgiler = array('isim' => "Aycan Ayhan", 'yas' => "26", 'mail' => "aycanayhan@mobilhanem.com", '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
Exit mobile version