How To Parse JSON in Android


JSON XML’ e altarnatif olan en iyi veri saklama yapısıdır. JSON formatı basit ve kullanışlıdır. JSON hakkında daha ayrıntılı bilgi isteyenlere bu adresi verebilirim. Türkçe hazırlanmış güzel bir kaynak.

Bu yazıda JSON örneğine geçmeden, yapısından bahsedeceğim. Anlaşılır olması için resimle ifade etmeye çalıştım, şimdi ne kadar basit olduğuna bakalım. Aşağıdaki resimde JSONOblect ve JSONArray yapısı var. Peki nedir bunlar? Hepimizin de bildiği gibi object ve array, bir JSON yapısı birden fazla object’ ten oluşabilir. Aynı zamanda bu object’ ler içine birden fazla array alabilir, yine aynı şekilde bu array’ ler de içine obect’ ler alabilirler. Biraz karışık gibi oldu fakat, resimde gayet açık olarak ifade etmeye çalıştım. Süslü parantez (curly brackets) ve köşeli parantezin (square brackets) tek farkı ise süslü parantez yani “{“ object’ ti, köşeli parantez yani “[“ array’ i ifader eder. 

Sonuç olarak aşağıdaki resmi özetlersek: JSON yapısı içinde bir tane “menu” object’ i içeriyor. Ve bu “menu” içerisinde “header” ve “items” object’ lerini barındırıyor. Gördüğünüz gibi “items” array’ den oluşuyor. Bunu “[” işaretinden anlıyoruz. Bu array’ in indexleri farkettiğiniz üzere virgüller ile ayrılmış. Ve yapı aşağıya doğru ilerliyor. Umuyorum ki anlaşıldı. 🙂

Tabi her zaman JSON verileri bu resimde olduğu gibi güzel kod yazımına sahip olmuyor, yani bitişik yazılıyor genelde. Örnek olarak aşağıdaki resim doviz.gen.tr adresinin günlük döviz kurları için oluşturduğu JSON formatında bir veri. Anlaşılması biraz daha zor. Sanki her şey iç içe girmiş gibi değil mi 🙂

Fakat bu gibi durumlar için bazı hizmetler de mevcut. Mesela, Json Parser Online güzel bir site. Yukarıda bahsettiğim gibi durumlarla karşılaşırsanız, json formatındaki veriyi kopyalayıp yapıştırın, site, o karmaşık veriyi sizin için okunur hâle getirecektir 🙂 Bunu da ağaşıdaki resimde göstermeye çalıştım.

 

Bu sayede object ve array’ leri ayırt etmek çok daha kolay hâle geliyor. Şimdi koda geçme zamanı.

Projenizde bir class oluşturun ve adı da JSONParser.java olsun. Bu class JSON data’ yı almak ve JSON object döndürmek için HTTP Request yapan bir yapıya sahip olacak. Parse Class’ ımız şu şekilde:

package yourpackage...;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;

import android.util.Log;

public class JSONParser {

	static InputStream is = null;
	static JSONObject jObj = null;
	static String json = "";

	// constructor
	public JSONParser() {

	}

	public JSONObject getJSONFromUrl(String url) {

		// Making HTTP request
		try {
			// defaultHttpClient
			DefaultHttpClient httpClient = new DefaultHttpClient();
			HttpGet httpGet = new HttpGet(url);

			HttpResponse httpResponse = httpClient.execute(httpGet);
			HttpEntity httpEntity = httpResponse.getEntity();
			is = httpEntity.getContent();

		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

		try {
			BufferedReader reader = new BufferedReader(new InputStreamReader(
					is, "UTF-8"), 8); // iso-8859-1 //
			StringBuilder sb = new StringBuilder();
			String line = null;
			while ((line = reader.readLine()) != null) {
				sb.append(line + "/n");
			}
			is.close();
			json = sb.toString();
		} catch (Exception e) {
			Log.i("Buffer Error", "Error converting result " + e.toString());
		}

		// try parse the string to a JSON object
		try {
			if (json != null) {
				jObj = new JSONObject(json);
			}else{
				jObj = null;
			}

		} catch (JSONException e) {
			Log.e("JSON Parser", "Error parsing data " + e.getMessage().toString());
		}

		// return JSON String
		return jObj;

	}
}

Şimdi gelelim bu class’ ı nasıl kullanacağımıza. Örnek olarak yukarıda bahsettiğim doviz.gen.tr’ nin sunduğu json data‘ yı alalım. Burada item’ ler var, dolar, euro, dolar2, euro2, vb. gibi. Bunlar için:

// url to make http request
private static String url = "http://www.doviz.gen.tr/doviz_json.asp?versio";

// JSON Node names
private static String TAG_DOLAR_ALIS  = "dolar";
private static String TAG_DOLAR_SATIS = "dolar2";
private static String TAG_EURO_ALIS   = "euro";
private static String TAG_EURO_SATIS  = "euro2";

// String values
String _dolarAlis;
String _dolarSatis;
String _euroAlis;
String _euroSatis;

onCreate() metodunun içinde:

// Creating JSON Parser instance
JSONParser jParser = new JSONParser();

// getting JSON string from URL
JSONObject json = jParser.getJSONFromUrl(url);

try {

	if (json != null) {
             	String _dolarAlis 	= json.getString(TAG_DOLAR_ALIS).toString();
             	String _dolarSatis 	= json.getString(TAG_DOLAR_SATIS).toString();
             	String _euroAlis	= json.getString(TAG_EURO_ALIS).toString();
             	String _euroSatis 	= json.getString(TAG_EURO_SATIS).toString();
	}

} catch (JSONException e) {
        Log.i("JSON_Hata", e.getMessage());
}

Buraya kadar tamam, sorun yok, fakat JSONArray’ den bahsettik ve bu örnekte json formatındaki veri array içermediği için örnek vermedik. Sizin de gördüğünüz gibi sadece object’ ler vardı. Array için de bir örnek vermekte fayda var. Aşağıdaki JSON yapımız olsun. Gördüğünüz gibi JSONArray = employees

Global olarak TAG’ ları, yani JSON Node objeler ve JSONArray tipinde contacts tanımlayalım.

// Node objects
private static String TAG_FIRSTNAME  = "firstName";
private static String TAG_LASTNAME   = "lastName";
private static String TAG_EMPLOYEES  = "employees";
// employees JSONArray
JSONArray employees = null;

Daha sonra onCreate() metodu içinde:

// Hashmap for ListView
ArrayList<HashMap<String, String>> employeeList = new ArrayList<HashMap<String, String>>();

// Creating JSON Parser instance
JSONParser jParser = new JSONParser();

// getting JSON string from URL
JSONObject json = jParser.getJSONFromUrl(url);

try {
    // Getting Array of Employees
    employees = json.getJSONArray(TAG_EMPLOYEES);

    // looping through All Employees
    for(int i = 0; i < employees.length(); i++){
        JSONObject c = employees.getJSONObject(i);

        // Storing each json item in variable
        String firstname = c.getString(TAG_FIRSTNAME);
        String lastname  = c.getString(TAG_LASTNAME);

        // creating new HashMap to add each element, then can be used in anywhere
        HashMap<String, String> map = new HashMap<String, String>();

        // adding each child node to HashMap key => value
        map.put(TAG_FIRSTNAME, firstname);
        map.put(TAG_LASTNAME, lastname);

        employeeList.add(map);

    }
} catch (JSONException e) {
    e.printStackTrace();
}

Gördüğünüz gibi buradaki yapı array olduğu için for döngüsü, JSONArray’ in uzunluğu kadar dönüyor ve her bir elemanı da employeeList’ in içine ekliyor.

Reklamlar

26 Eyl 2012 tarihinde Android içinde yayınlandı ve , , , , , , , olarak etiketlendi. Kalıcı bağlantıyı yer imlerinize ekleyin. 2 Yorum.

  1. egemen durmus

    nested array ler içinde bir örneğiniz varmı ?

    örnek çok yararlı elinize sağlık ?

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s

%d blogcu bunu beğendi: