Membangun Class JSON(javaScript Object Notation) untuk definisi pertukaran data antara server dan klien

Ini adalah lanjutan dari tutorial tentang komunikasi antara Android, PHP dan MYSQL database. Tapi sebelum melanjutkan baca halaman ini, bacalah lebih dahulu tutorial bagian1, bagian 2 dan bagian 3.

Di halaman ini kita akan membuat sebuah class JSON yang akan di pakai oleh class-class lain-nya agar sebuah aplikasi bisa dinamik dan responsive. Kalau perhatikan isi  dari class-class di tutorial bagian1, 2 dan 3 ...disana  JSON_nya telah di deklarasi dan telah terpakai dengan nama ClassJSONParser.java. Saya sengaja menamakan-nya demikian karena ia memang bekerja untuk 'parsing' data antar klien dan server.

Berikut adalah isi dari ClassJSONParser.java
package com.vik_sintus.projects.koneksiandroidmysql;
/** ©Vik Sintus Projects */
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
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.json.JSONException;
import org.json.JSONObject;

import android.util.Log;
 
public class ClassJSONParser {
 
    static InputStream inputStreamNya = null;
    static JSONObject JSONObjectNya = null;
    static String jsonStringNya = "";
 
    // berikut adalah constructor-nya
    public ClassJSONParser() {
 
    }
    
    //ambil json object melalui url script_nya maksudnya
    //object yang dari php yang ada di server
    public JSONObject ambilJsonDariUrl(final String urlNya) {

        // object dari Json di ambil melalui http request
        try {
            // kirim data bolak-balik pakai 'post' yah biar agak aman.
            DefaultHttpClient httpClientNya = new DefaultHttpClient();
            HttpPost httpPostNya = new HttpPost(urlNya);

            // begitu juga dengan jawaban dari server pakai metode POST
            HttpResponse httpResponseNya = httpClientNya.execute(httpPostNya);
            // mengambil data yang dapat di response oleh server.
            HttpEntity httpEntityNya = httpResponseNya.getEntity();
            // buka sebuah inputStream ke data yang ada.
            inputStreamNya = httpEntityNya.getContent();

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

        try {
            // buat sebuah  BufferedReader untuk di parse melalui inputStream.
            BufferedReader bufferedReaderNya = new BufferedReader(new InputStreamReader(
                    inputStreamNya, "iso-8859-1"), 8);
            // deklarasikan sebuah string utk membantu proses parsing-nya.
            StringBuilder stringBuilderNya = new StringBuilder();
            // deklarasi sebuah string utk menyimpan 
            // data JSON object dalam bentuk string.
            String barisanStringNya = null;
            
            // susun string-nya sampai null(habis). baris demi baris
            while ((barisanStringNya = bufferedReaderNya.readLine()) != null) {
                stringBuilderNya.append(barisanStringNya + "\n");
            }
            
            // tutup input stream-nya.
            inputStreamNya.close();
            // ubalah 'string builder data' menjadi string aslinya.
            jsonStringNya = stringBuilderNya.toString();
        } catch (Exception e) {
            Log.e("BufferNya Salah", "Salah mengolah menjadi string aslinya " + e.toString());
        }

        // coba mengolah stringNya menjadi sebuah JSON object
        try {
            JSONObjectNya = new JSONObject(jsonStringNya);
        } catch (JSONException e) {
            Log.e("JSON ParserNya", "Salah Mengolah data " + e.toString());
        }

        return JSONObjectNya;

    }
    
 
    // fungsi ambilJsonDariUrl dengan
    // cara HTTP POST atau GET 
    public JSONObject membuatHttpRequest(String urlNya, String caraNya,
            List<NameValuePair> parameterNya) {
 
        // buat jalur HTTP-nya
        try {
 
            // priksa metode yang di pakai POST atau GET
            if(caraNya == "POST"){
                DefaultHttpClient httpClientNya = new DefaultHttpClient();
                HttpPost httpPostNya = new HttpPost(urlNya);
                httpPostNya.setEntity(new UrlEncodedFormEntity(parameterNya));
 
                HttpResponse httpResponseNya = httpClientNya.execute(httpPostNya);
                HttpEntity httpEntityNya = httpResponseNya.getEntity();
                inputStreamNya = httpEntityNya.getContent();
            //kalau pakai cara 'GET' maka search string_nya akan
            //tampak di URL
            }else if(caraNya == "GET"){
                DefaultHttpClient defaultHttpClientNya = new DefaultHttpClient();
                String stringYgTampakDiUrl = URLEncodedUtils.format(parameterNya, "utf-8");
                urlNya += "?" + stringYgTampakDiUrl;
                HttpGet httpGetNya = new HttpGet(urlNya);
 
                HttpResponse httpResponseNya = defaultHttpClientNya.execute(httpGetNya);
                HttpEntity httpEntityNya = httpResponseNya.getEntity();
                inputStreamNya = httpEntityNya.getContent();
            }           
 
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
 
        try {
            BufferedReader bufferedReaderNya = new BufferedReader(new InputStreamReader(
                    inputStreamNya, "iso-8859-1"), 8);
            StringBuilder stringBuilderNya = new StringBuilder();
            String barisanDataNya = null;
            while ((barisanDataNya = bufferedReaderNya.readLine()) != null) {
             stringBuilderNya.append(barisanDataNya + "\n");
            }
            inputStreamNya.close();
            jsonStringNya = stringBuilderNya.toString();
        } catch (Exception e) {
            Log.e("Buffer_nya Error", "Salah mengkonvert hasil" + e.toString());
        }
 
        // coba parsing string-nya menjadi JSON object
        try {
            JSONObjectNya = new JSONObject(jsonStringNya);
        } catch (JSONException e) {
            Log.e("JSON ParserNya", "Salah proses datanya " + e.toString());
        }
 
        return JSONObjectNya;
 
    }
}


Saya telah menyisipkan banyak komentar di dalam kode di atas.... silahkan di coba di bangun di android dan di kembangkan menjadi aplikasi besar

Kalau ingin coba menjalankan aplikasi ini di HP atau di emulator ...Berikut adalah beberapa file pelengkap aplikasi ini. Ada satu file xml yang tidak ada class pasangan-nya seperti ClassBacaKomentar.java berpasangan dengan baca_komentar.xml.
File yang yang tak punya pasangan itu bernama komentar_tunggal.xml yang harus di tempatkan bersama file xml yang lain-nya di dalam folder 'layout' di android. Dia bekerja untuk mengatur tampilan dari setiap satu komentar. Berikut adalah isi dari file komentar_tunggal.xml

<?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:background="#f0f0f0"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:background="@drawable/garis_pinggir_komentar"
        android:orientation="vertical" >

        <LinearLayout
            android:id="@+id/kotakKomentar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="2dp"
            android:background="@drawable/latar_belakang_komentar"
            android:orientation="horizontal" >

            <ImageView
                android:id="@+id/imageView1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/lodokn_one" />

            <LinearLayout
                android:id="@+id/kotakKomentar"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_margin="2dp"
                android:orientation="vertical"
                android:padding="5dp" >

                <TextView
                    android:id="@+id/judul"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="bottom"
                    android:paddingBottom="2dip"
                    android:paddingLeft="5dp"
                    android:paddingTop="6dip"
                    android:textColor="#333"
                    android:textSize="16sp"
                    android:textStyle="bold" />

                <TextView
                    android:id="@+id/komentar"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:paddingBottom="2dip"
                    android:paddingLeft="8dp"
                    android:textColor="#888" >
                </TextView>

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="horizontal"
                    android:paddingBottom="5dp" >

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:gravity="left"
                        android:paddingLeft="5dp"
                        android:text="Nama: "
                        android:textColor="#5d5d5d"
                        android:textStyle="bold" >
                    </TextView>

                    <TextView
                        android:id="@+id/usernameNya"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:gravity="left"
                        android:textColor="#acacac"
                        android:textStyle="bold" >
                    </TextView>
                </LinearLayout>
            </LinearLayout>
        </LinearLayout>
    </LinearLayout>
</LinearLayout>

Perhatikan file komentar_tunggal.xml diatas ia minta dua buah file untuk di masuk-kan ke dalam folder 'drawable' . Kedua file tsb antara lain:
garis_pinggir_komentar.xml yang isinya nampak sebagai berikut:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="true"><shape>
            <solid android:color="#cccccc" />
        </shape></item>
    <item><shape>
            <gradient android:angle="270" 
                      android:endColor="#ccc" 
                      android:startColor="#fff" />

            <corners android:radius="2dp" />
        </shape></item>

</selector>

Dan latar_belakang_komentar.xml sebagai berikut
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="true">
        <shape>
            <solid android:color="#cccccc" />
        </shape></item>
    <item><shape>
            <gradient android:angle="90" 
                      android:endColor="#f5f5f5" 
                      android:startColor="#fff" />
        </shape></item>

</selector>

Berikut adalah isi dari AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.vik_sintus.projects.koneksiandroidmysql"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />
    <uses-permission android:name="android.permission.INTERNET"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/nama_aplikasi"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.vik_sintus.projects.koneksiandroidmysql.ClassUtkLogIn"
            android:label="@string/nama_aplikasi" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.vik_sintus.projects.koneksiandroidmysql.ClassRegistrasi"
            android:label="@string/nama_aplikasi"  >
        </activity>
        <activity
            android:name="com.vik_sintus.projects.koneksiandroidmysql.ClassTambahKomentar"
            android:label="@string/nama_aplikasi"  >
        </activity>
         <activity
            android:name="com.vik_sintus.projects.koneksiandroidmysql.ClassBacaKomentar"
            android:label="@string/nama_aplikasi"  >
        </activity>
    </application>

</manifest> 
masih ada beberapa file lagi ... stay tune yah

9 comments:

  1. diterusin lagi bro...bermanfaat banget..
    kalo bisa saya minta contoh2 lain kasus database..seperti update misalnya..hehe

    ReplyDelete
  2. setelah membuat JSON ada lanjutannya lagi gan ?

    ReplyDelete
  3. gan, dilanjutin dong. Ini bagus banget buat belajar :D

    ReplyDelete
  4. Om.plis projeknya diupload ke github....gw pake hp nih codingnya ..jadi susah kalo copy paste :(

    ReplyDelete
  5. Gan.. mana nih lanjutan code nya.. sayang udah sudah setengah jalan...

    ReplyDelete
  6. sampai tahap ini aku tarik pertanyaan ku di bagian 1 dan 2 soalnya udah ngerti_

    buat om semangat tuess..... yah_

    karena tutorial ini sangat membantu bagi kami yg sedang belajar java_

    dan aku tunggu tutor lengkapnya, katanya masih ada tuh heheheh......._

    makasij omm..........

    ReplyDelete
  7. Setelah ulang mengulang tutor dari bagian 1, 2,3 sampai tahap ini (JSON)_
    Ternyata tutornya dah finish alias tidak ada lagi file2 pendukung yg lain_
    dengan demikian sekali lagi aku tarik pernyataan diatas di bait ke 4 :D_

    Salam dari aku "Aat Mendua"
    //Aat Mendua itu artinya Hijra dari BlackBerry ke Android hehehe...............
    //Hidup Android indonesia............

    if (ternyata masih ada file pendukungnya diluar kesadaran ku mohon petunjuknya om)
    {
    komen ini di hapus aja om
    }else{
    heehehee.................................
    }

    ReplyDelete