Jumat, Maret 01, 2013

Cara Mudah Parsing JSON Array dengan Android

http://rapidpurple.com/purpleblog/wp-content/uploads/2011/11/php_mysql_logo.png

Salam Developer, kali ini kita akan melanjutkan postingan sebelumnya mengenai membuat login form Android dengan PHP MySQL. Untuk kali ini kita akan melakukan parsing data dari JSONArray menjadi data yang tampil dalam bentuk listview di Android. Jika ingin membuka postingan sebelumnya klik link berikut

Untuk persiapan, tool tool yang kita butuhkan adalah

1. Apache Web Server dan mySQL bisa pake XAMPP download disini –> XAMPP

2. Eclipse dan Android SDK –> versi yang saya gunakan disini ada 2.3.3 Ginggerbeard

3. Notepad++ atau Dreamweaver terserah mau pake yang mana untuk edit file PHP

4. Kopi/Susu + roti bakar Open-mouthed smile --> Wajib nih meski cuman singkat tutorialnya Smile

Bagian 1 Buat Project baru pada Android

Seperti sebelumnya copykan file class JSONParser yang ada di postingan sebelumnya ke project ini. Setelah itu pada main class kita akan menghandle fungsi fungsi JSON dan HTTP-POST. (ingat class dan package yang saya gunakan dalam project ini adalah default dari komputer saya. jadi ketika anda melakukan copas cek sesuai dengan konfigurasi milik anda)

JSONArrayActivity

package com.eepis.android;

import java.util.ArrayList;
import java.util.List;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

public class JSONArrayActivity extends ListActivity{
    /** Called when the activity is first created. */
    List<String> items,items2;
    private JSONParser jsonParser;
    String ServerURL = "http://10.0.2.2/tes/";    //alamat lokasi file untuk menangkap/mengirim JSON
    String list_tag = "getlistuser";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.list);
        items=new ArrayList<String>();
        items2=new ArrayList<String>();
        //Memanggil class JSONParser
        jsonParser = new JSONParser();
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair("tag",list_tag));
        //Mengirim parameter yang akan di tangkap server
        JSONObject json = jsonParser.getJSONFromUrl(ServerURL, params);
        try{
            JSONArray  data = json.getJSONArray("user"); //key ini didapat dari nama array yang kita buat di dalam JSON
            for(int i=0;i < data.length();i++){                       
                JSONObject e = data.getJSONObject(i);
                  items.add(e.getString("name"));
                  items2.add(e.getString("email"));
            }
        }catch(JSONException e){
            e.printStackTrace();
        }
        setListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,items));
    }
    protected void onListItemClick(ListView l, View v, int position,
            long id) {
        super.onListItemClick(l,v,position, id);
        String text = ""+ items.get(position);
        String textemail = ""+ items2.get(position);
        Toast.makeText(this, "name:"+text+" email:"+textemail, 1).show();                  
    }
}

list.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="fill_parent"
    android:orientation="vertical" >
   
    <ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:drawSelectorOnTop="false"
        android:background="#3b3b3b">
    </ListView>
        <TextView
        android:id="@android:id/empty"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        style="@android:style/TextAppearance.Large"
        android:gravity="center"
        android:text="Data tidak ditemukan">
    </TextView>

</LinearLayout>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.eepis.android"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="10" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:label="@string/app_name"
            android:name=".JSONArrayActivity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    <uses-permission android:name="android.permission.INTERNET" />
</manifest>

Bagian 2 Buat API yang menghandle request dari Android

Pada server side kita membuat API yang menangkap Http-Post yang kita kirim via android dan mengembalikannya ke kita dalam bentuk JSON. Untuk database pada project kali ini kita tetap memakai database pada postingan sebelumnya pada Membuat Login Form di Android dengan PHPMySQL. Jadi disini kita akan mengambil data user yang terdapat dalam database.

untuk file DB_Connect.php dan config.php bisa dilihat pada postingan sebelumnya

index.php

<?php

/**
File ini untuk menghandle API Request
hasilnya di encoda dalam bentuk JSON
  /**
* check for POST request
*/
if (isset($_POST['tag']) && $_POST['tag'] != '') {
    // Tag
    $tag = $_POST['tag'];

    // Database Handler
    require_once 'include/DB_Functions.php';
    $db = new DB_Functions();

    // Response--> data yang akan dikembalikan
    $response = array("tag" => $tag, "success" => 0);
   
    // Cek tipe tag
    if ($tag == 'login') {
        // Tangkap data yang dikirim dari android
        $email = $_POST['email'];
        $password = $_POST['password'];

        // Cek user
        $user = $db->getUserByEmailAndPassword($email, $password);
        if ($user != false) {
            // User ditemukan
            $response["success"] = 1;
            echo json_encode($response);
        } else {
            // User tidak ditemukan
            $response["success"] = 0;
            echo json_encode($response);
        }
    }
    else if ($tag == 'register') {
        // Tangkap data yang dikirim dari android
        $name = $_POST['name'];
        $email = $_POST['email'];
        $password = $_POST['password'];

        // cek user sudah ada atau belum
        if ($db->isUserExisted($email)) {
            // User sudah ada
            $response["success"] = 0;
            $response["error_msg"] = "User sudah ada";
            echo json_encode($response);
        } else {
            // Simpan user baru
            $user = $db->storeUser($name, $email, $password);
            if ($user) {
                // Registrasi Berhasil
                $response["success"] = 1;
                echo json_encode($response);
            } else {
                // Registrasi Gagal
                $response["success"] = 0;
                echo json_encode($response);
            }
        }
    }
   
    else if ($tag == 'getlistuser') {
        //Mengambil data list
        $list=$db->getUserList();
        $response["user"] = $list;
        if($list!=false){
            $response["success"] = 1;
            echo json_encode($response);
        }
        else{
            $response["success"] = 0;
            echo json_encode($response);       
        }
    }
   
    else {
        echo "Invalid Request";
    }
} else {
    echo "Access Denied";
}
?>

DB_Function.php

<?php

class DB_Functions {

    private $db;
    // constructor
    function __construct() {
        require_once 'DB_Connect.php';
        // Koneksi ke database
        $this->db = new DB_Connect();
        $this->db->connect();
    }

    // destructor
    function __destruct() {
       
    }
   
    public function storeUser($name, $email, $password) {
        $uuid = uniqid('', true);
        $hash = $this->hashSSHA($password);
        $encrypted_password = $hash["encrypted"]; // Enkripsi password
        $salt = $hash["salt"]; // salt
        $result = mysql_query("INSERT INTO users(unique_id, name, email, encrypted_password, salt, created_at) VALUES('$uuid', '$name', '$email', '$encrypted_password', '$salt', NOW())");
        // Cek registrasi berhasil
        if ($result) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * Cek user di database
     */
    public function getUserByEmailAndPassword($email, $password) {
        $result = mysql_query("SELECT * FROM users WHERE email = '$email'") or die(mysql_error());
        $no_of_rows = mysql_num_rows($result);
        if ($no_of_rows > 0) {
            $result = mysql_fetch_array($result);
            $salt = $result['salt'];
            $encrypted_password = $result['encrypted_password'];
            $hash = $this->checkhashSSHA($salt, $password);
            // Cek kesamaan password
            if ($encrypted_password == $hash) {
                // Identifikasi berhasil
                return true;
            }
        } else {
            // User tidak ditemukan
            return false;
        }
    }

    /**
     * Cek user exist atau tidak
     */
    public function isUserExisted($email) {
        $result = mysql_query("SELECT * from users WHERE email = '$email'");
        $no_of_rows = mysql_num_rows($result);
        if ($no_of_rows > 0) {
            // user exist
            return true;
        } else {
            // user tidak exist
            return false;
        }
    }
        /**
    Enkripsi password
     */
    public function hashSSHA($password) {

        $salt = sha1(rand());
        $salt = substr($salt, 0, 10);
        $encrypted = base64_encode(sha1($password . $salt, true) . $salt);
        $hash = array("salt" => $salt, "encrypted" => $encrypted);
        return $hash;
    }


    public function checkhashSSHA($salt, $password) {

        $hash = base64_encode(sha1($password . $salt, true) . $salt);

        return $hash;
    }
   
    public function getUserList() {

        $result=mysql_query("SELECT name,email from users");       
        $resultNo = mysql_num_rows($result);

        if ($result != null) {
            //Jika hanya satu return valuenya
            if ($resultNo == 1) {

                // Return result
                $resultSet[] = mysql_fetch_assoc($result);
                return $resultSet;

            //Jika lebih dari satu lakukan looping
            } else {

                //tambahkan tiap baris ke array
                while($row = mysql_fetch_assoc($result)) {
                $resultSet[] = $row;
                }
                return $resultSet;
            }
        }
        else{
            return false;
        }
    }
}
?>

Bagian 3 Hasil running aplikasi

File JSON yang dikirim ke android berbentuk

{"tag":"getlistuser","success":1,"user":[{"name":"moresky","email":"moresky@gmail.com"},{"name":"coba","email":"coba@gmail.com"},{"name":"andi","email":"andi@gmail.com"},{"name":"budi","email":"budi@gmail.com"},{"name":"lia","email":"lia@gmail.com"}]}

Hasil tampilan pada aplikasi

image   image


Demikianlah tutorial kali ini semoga bisa bermanfaat buat kawan kawan sekalian. Untuk source projectnya bisa di download di alamat berikut

DOWNLOAD

Mungkin beberapa dari anda menemukan kendala force close ketika mencoba menjalankan project ini di device Android anda. Hal itu dimungkinkan karena device yang anda gunakan menggunakan OS Android ICS. Nah pada ICS networking harus dilakukan di background thread berbeda pada GB(Android 2.3.3). Jadi jika menggunakan SDK 2.3.3 ada baiknya kita menggunakan ASyncTask untuk melakukan networking jika target buildnya pada Android ICS. Tutorial selanjutnya akan membahas tentang ASyncTask di Android. So Keep Update ya Open-mouthed smile

jika ada pertanyaan silahkan saja email saya di bagibagi23@gmail.com

3 komentar:

  1. Refernsi yang bermanfaat buat tugas akhir
    terima kasih banyak gan tolong selalu up to date

    BalasHapus
  2. cara input tag pada json gimana ??

    BalasHapus
  3. @slamet: Jika menggunakan Chrome pakai addon Postman, jika menggunakan Firefox pakai addon Restclient

    BalasHapus