#ANDROID - JSON Parse (ayrıştırma) İşlemi
Özellikle akıllı telefonlar hayatımızdaki yerini arttırdığından beri web servis işleri artık olmazsa olmaz bir hale gelmiş durumda. Çünkü hazırladığımız bir web sitesini kullanıcı sayısını arttırmak adına bir mobil uygulamaya dahil etmek istiyoruz. Durum böyle olunca uzak sunucudaki verilere ulaşmak için web servis yazmak zorunda kalıyoruz.
Biz son yılların en önemli ve iddialı web servis aracı JSON'ı kullanacağız.
Ben minibusyollari.com'un uygulamasını yapmak istediğim için burada onun üzerinden gideceğim.
Sol tarafta gördüğünüz gibi JSON dili bu şekilde kolay, anlaşılabilir ve basit bir dil.
Bu sayfa böyle aşağıya doğru uzayıp gidiyor. Yaklaşık 300 küsür tane hat bilgisi mevcut.
Biz buradaki hat isimlerini çekerek uygulamamızda listelemek istiyoruz.
Bu uygulamadaki sayfalarımız MainActiviy.java, mainactivity.xml, ServiceHandler.java ve list_item.xml şeklinde.
ServiceHandler.java sayfamızı yabancı bir abimiz yazmış ve bizde direkt olarak bu sayfayı urlden verileri almak için kopyalayacağız.
Madem öyle ilk olarak ServiceHandler.java dosyamızın kodlarını yazalım.
ServiceHandler.java dosyası:
Daha sonra bu verileri ListActivity'den kalıtacağımız (extends) için listemizin tasarımını yapmak üzere list_item.xml dosyamızı oluşturalım.
list_item.xml dosyası:
Tabi burada email label, mobile label falan yazıyor çok takılmayın yabancı kaynaktan araştırma yapmak zorunda kaldığımız için böyle oluyor. Amacına uygun, işimi görecek kadar düzenleme yaptım faso fisosuna karışmadım.
Neyse biz devam edelim. Şimdi mainactivity.xml dosyamızın içerine bir ListView ekliyoruz.
mainactivity.xml dosyası:
Daha sonra hemen MainActivity.java kodlarımıza geçelim.
MainActivity.java dosyası:
Evet burada da JsonArray ve JsonObject ayrıştırmalarını yapıp ListView'imizde listeliyoruz. Bu kısmı anlayabilmek için JSON diline hakim olmak gerek.
Onun haricinde kodlarımızı kullanıcıya JSON çekme ve işleme sırasında bir dialog gösterebilmek için AsynTask içerinde yazıyoruz.
onPreExecute() kısmında dialog'u oluşturuyoruz, doInBackground kısmında JSON ayrıştırma kodlarımızı yazıyoruz, son olarak onPostExecute kısmında ise dialogu kapatıp listeleme işlemini yapıyoruz.
Makale görseli:
Biz son yılların en önemli ve iddialı web servis aracı JSON'ı kullanacağız.
Ben minibusyollari.com'un uygulamasını yapmak istediğim için burada onun üzerinden gideceğim.
Sol tarafta gördüğünüz gibi JSON dili bu şekilde kolay, anlaşılabilir ve basit bir dil.
Bu sayfa böyle aşağıya doğru uzayıp gidiyor. Yaklaşık 300 küsür tane hat bilgisi mevcut.
Biz buradaki hat isimlerini çekerek uygulamamızda listelemek istiyoruz.
Bu uygulamadaki sayfalarımız MainActiviy.java, mainactivity.xml, ServiceHandler.java ve list_item.xml şeklinde.
ServiceHandler.java sayfamızı yabancı bir abimiz yazmış ve bizde direkt olarak bu sayfayı urlden verileri almak için kopyalayacağız.
Madem öyle ilk olarak ServiceHandler.java dosyamızın kodlarını yazalım.
ServiceHandler.java dosyası:
package com.example.jsonparsing1;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
public class ServiceHandler {
static String response = null;
public final static int GET = 1;
public final static int POST = 2;
public ServiceHandler() {
}
/**
* Making service call
* @url - url to make request
* @method - http request method
* */
public String makeServiceCall(String url, int method) {
return this.makeServiceCall(url, method, null);
}
/**
* Making service call
* @url - url to make request
* @method - http request method
* @params - http request params
* */
public String makeServiceCall(String url, int method,
List<NameValuePair> params) {
try {
// http client
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpEntity httpEntity = null;
HttpResponse httpResponse = null;
// Checking http request method type
if (method == POST) {
HttpPost httpPost = new HttpPost(url);
// adding post params
if (params != null) {
httpPost.setEntity(new UrlEncodedFormEntity(params));
}
httpResponse = httpClient.execute(httpPost);
} else if (method == GET) {
// appending params to url
if (params != null) {
String paramString = URLEncodedUtils
.format(params, "utf-8");
url += "?" + paramString;
}
HttpGet httpGet = new HttpGet(url);
httpResponse = httpClient.execute(httpGet);
}
httpEntity = httpResponse.getEntity();
response = EntityUtils.toString(httpEntity);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return response;
}
}
Daha sonra bu verileri ListActivity'den kalıtacağımız (extends) için listemizin tasarımını yapmak üzere list_item.xml dosyamızı oluşturalım.
list_item.xml dosyası:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="10dp"
android:paddingLeft="10dp"
android:paddingRight="10dp" >
<!-- Name Label -->
<TextView
android:id="@+id/name"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingBottom="2dip"
android:paddingTop="6dip"
android:textColor="#43bd00"
android:textSize="16sp"
android:textStyle="bold" />
<!-- Email label -->
<TextView
android:id="@+id/email"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingBottom="2dip"
android:textColor="#acacac" />
<!-- Mobile number label -->
<TextView
android:id="@+id/mobile"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="left"
android:text="Mobile: "
android:textColor="#5d5d5d"
android:textStyle="bold" />
</LinearLayout>
Tabi burada email label, mobile label falan yazıyor çok takılmayın yabancı kaynaktan araştırma yapmak zorunda kaldığımız için böyle oluyor. Amacına uygun, işimi görecek kadar düzenleme yaptım faso fisosuna karışmadım.
Neyse biz devam edelim. Şimdi mainactivity.xml dosyamızın içerine bir ListView ekliyoruz.
mainactivity.xml dosyası:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<!-- Main ListView
Always give id value as list(@android:id/list)
-->
<ListView
android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
Daha sonra hemen MainActivity.java kodlarımıza geçelim.
MainActivity.java dosyası:
package com.example.jsonparsing1;
import java.util.ArrayList;
import java.util.HashMap;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.ListActivity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
public class MainActivity extends ListActivity {
private ProgressDialog pDialog;
// URL to get contacts JSON
private static String url = "http://minibusyollari.com/MinibusApi/";
// JSON Node names
private static final String TAG_HATLAR = "hatlar";
private static final String TAG_ID = "id";
private static final String TAG_NAME = "name";
private static final String TAG_URL = "url";
// contacts JSONArray
JSONArray contacts = null;
// Hashmap for ListView
ArrayList<HashMap<String, String>> contactList;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
contactList = new ArrayList<HashMap<String, String>>();
ListView lv = getListView();
// Calling async task to get json
new GetContacts().execute();
}
/**
* Async task class to get json by making HTTP call
* */
private class GetContacts extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
// Showing progress dialog
pDialog = new ProgressDialog(MainActivity.this);
pDialog.setMessage("Lütfen bekleyin...");
pDialog.setCancelable(false);
pDialog.show();
}
@Override
protected Void doInBackground(Void... arg0) {
// Creating service handler class instance
ServiceHandler sh = new ServiceHandler();
// Making a request to url and getting response
String jsonStr = sh.makeServiceCall(url, ServiceHandler.GET);
Log.d("Response: ", "> " + jsonStr);
if (jsonStr != null) {
try {
JSONObject jsonObj = new JSONObject(jsonStr);
// Getting JSON Array node
contacts = jsonObj.getJSONArray(TAG_HATLAR);
// looping through All Contacts
for (int i = 0; i < contacts.length(); i++) {
JSONObject c = contacts.getJSONObject(i);
String id = c.getString(TAG_ID);
String name = c.getString(TAG_NAME);
String url = c.getString(TAG_URL);
// tmp hashmap for single contact
HashMap<String, String> contact = new HashMap<String, String>();
// adding each child node to HashMap key => value
contact.put(TAG_ID, id);
contact.put(TAG_NAME, name);
contact.put(TAG_URL, url);
// adding contact to contact list
contactList.add(contact);
}
} catch (JSONException e) {
e.printStackTrace();
}
} else {
Log.e("ServiceHandler", "Bu url'de veri yok.");
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
// Dismiss the progress dialog
if (pDialog.isShowing())
pDialog.dismiss();
/**
* Updating parsed JSON data into ListView
* */
ListAdapter adapter = new SimpleAdapter(
MainActivity.this, contactList,
R.layout.list_item, new String[] { TAG_ID, TAG_NAME,
TAG_URL }, new int[] { R.id.name,
R.id.email, R.id.mobile });
setListAdapter(adapter);
}
}
}
Evet burada da JsonArray ve JsonObject ayrıştırmalarını yapıp ListView'imizde listeliyoruz. Bu kısmı anlayabilmek için JSON diline hakim olmak gerek.
Onun haricinde kodlarımızı kullanıcıya JSON çekme ve işleme sırasında bir dialog gösterebilmek için AsynTask içerinde yazıyoruz.
onPreExecute() kısmında dialog'u oluşturuyoruz, doInBackground kısmında JSON ayrıştırma kodlarımızı yazıyoruz, son olarak onPostExecute kısmında ise dialogu kapatıp listeleme işlemini yapıyoruz.
Makale görseli:


Hiç yorum yok :
Yorum Gönder