Networking - Mengakses JSON Services

Dalam latihan sebelumnya kita sudah mempelajari bagaimana mengakses XML web services dengan menggunakan HTTP untuk terkoneksi dengan web server dan kemudian mendapatkan hasilnya dalam XML. Kita juga sudah belajar bagaimana menggunakan DOM untuk mem-parse hasil dokumen XML. Tetapi, dengan memodifikasi dokumen XML adalah pekerjaan yang sangat boros komputasi untuk perangkat mobile karena:
  • Dokumen XML sangat panjang. DOkuen-dokumen tersebut menggunakan tag-tag untuk menyimpan informasi, dan ukuran dokumen XML bisa sangat cepat menjadi sangat besar. Dokumen XML yang sangat besar berarti bahwa perangkat kita juga akan membutuhkan bandwidth yang lebih banyak untuk mendownloadnya, yang berarti ada biaya yang lebih besar.
  • Dokumen-dokumen XML lebih sulit diproses. Seperti bisa dilihat sebelumnya, kita harus menggunakan DOM untuk menelusur struktur tree untuk mengambil informasi yang kita inginkan. Hal ini sangat boros baik dalam hal CPU maupun memory.
Cara yang jauh lebih efisien adalah menyajikan informasi dalam bentuk JSON (JavaScript Object Notation). JSON adalah format pertukaran data yang ringan yang mudah dibaca dan ditulis oleh manusia. Untungnya juga mudah di-parse dan dihasilkan oleh mesin (komputer). Berikut adalah salah satu contoh tampilan isi JSON:
[
{"appeId":"1","survId":"1","location":"","surveyDate":"2008-03-14","surveyTime":"12:19:47","inputUserId":"1","inputTime":"2008-03-14 12:21:51","modifyTime":"0000-00-00 00:00:00"}, 
{"appeId":"2","survId":"32","location":"","surveyDate":"2008-03-14","surveyTime":"22:43:09","inputUserId":"32","inputTime":"2008-03-14 22:43:37","modifyTime":"0000-00-00 00:00:00"}, 
{"appeId":"3","survId":"32","location":"","surveyDate":"2008-03-15","surveyTime":"07:59:33","inputUserId":"32","inputTime":"2008-03-15 08:00:44","modifyTime":"0000-00-00 00:00:00"}, 
{"appeId":"4","survId":"1","location":"","surveyDate":"2008-03-15","surveyTime":"10:45:42","inputUserId":"1","inputTime":"2008-03-15 10:46:04","modifyTime":"0000-00-00 00:00:00"}, 
{"appeId":"5","survId":"32","location":"","surveyDate":"2008-03-16","surveyTime":"08:04:49","inputUserId":"32","inputTime":"2008-03-16 08:05:26","modifyTime":"0000-00-00 00:00:00"}, 
{"appeId":"6","survId":"32","location":"","surveyDate":"2008-03-20","surveyTime":"20:19:01","inputUserId":"32","inputTime":"2008-03-20 20:19:32","modifyTime":"0000-00-00 00:00:00"}
]
Isi JSON tersebut di atas adalah data yang diambil untuk suatu survey. Harap diperhatikan bahwa informasi tersebut adalah kumpulan pasangan antara key-value; dan masing-masing pasangan key-value dikelompokkan dalam daftar object yang berurut. Tidak seperti XML yang punya banyak nama-nama tag, JSON hanya berisi tanda kurung dan kurung kurawal.

Berikut adalah latihan mengakses JSON services di internet:

1. Kita buat project dan beri nama JSON.

2. Kita tambahkan permission untuk mengakses internet di file 'AndroidManifest.xml' seperti berikut ini:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.json">
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

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

</manifest>

3.Tambahkan kode berikut dalam file 'MainActivity.java':
package com.example.json;

import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.Toast;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import org.json.JSONArray;
import org.json.JSONObject;

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

public class MainActivity extends AppCompatActivity {

public String readJSONFeed(String URL) {
StringBuilder strBuilder = new StringBuilder();
HttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(URL);
try {
HttpResponse response = client.execute(httpGet);
StatusLine statusLine = response.getStatusLine();
int statusCode = statusLine.getStatusCode();
if (statusCode == 200) {
HttpEntity entity = response.getEntity();
InputStream content = entity.getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(content));
String line;
while ((line = reader.readLine()) != null) {
strBuilder.append(line);
}
} else {
Log.e("JSON", "Failed to download file");
}
}
catch(ClientProtocolException e){
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return strBuilder.toString();
}

private class ReadJSONFeedTask extends AsyncTask {
protected String doInBackground(String... urls) {
return readJSONFeed(urls[0]);
}

protected void onPostExecute(String result) {
try {
JSONArray jsonArray = new JSONArray(result);
Log.i("JSON", "Number of surveys in feed: " + jsonArray.length());

/*print out isi json feed*/
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
Toast.makeText(getBaseContext(), jsonObject.getString("appeId") +
" - " + jsonObject.getString("inputTime"), Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new ReadJSONFeedTask().execute("http://extjs.org.cn/extjs/examples/grid/survey.html");
}
}
4. Jalankan di emulator Android Studio. Class 'Toast' akan menampilkan isi informas secara berurutan. Berikut adalah tampilan hasilnya:
Isi informasi JSON ditampilkan berurutan

Penjelasan:

Pertama kita perlu membuat method 'readJSONFeed()' seperti berikut:
public String readJSONFeed(String URL) {
StringBuilder strBuilder = new StringBuilder();
HttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(URL);
try {
HttpResponse response = client.execute(httpGet);
StatusLine statusLine = response.getStatusLine();
int statusCode = statusLine.getStatusCode();
if (statusCode == 200) {
HttpEntity entity = response.getEntity();
InputStream content = entity.getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(content));
String line;
while ((line = reader.readLine()) != null) {
strBuilder.append(line);
}
} else {
Log.e("JSON", "Failed to download file");
}
}
catch(ClientProtocolException e){
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return strBuilder.toString();
}
Method tersebut mengkoneksikan ke URL tertentu dan kemudian membaca response dari web server. Method tersebut kemudian mengembalikan suatu nilai string sebagai hasilnya.

Untuk memanggil method 'readJSONFeed()' secara asynchronous, kita menggunakan subclass dari class 'AsyncTask':
private class ReadJSONFeedTask extends AsyncTask {
protected String doInBackground(String... urls) {
return readJSONFeed(urls[0]);
}

protected void onPostExecute(String result) {
try {
JSONArray jsonArray = new JSONArray(result);
Log.i("JSON", "Number of surveys in feed: " + jsonArray.length());

/*print out isi json feed*/
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
Toast.makeText(getBaseContext(), jsonObject.getString("appeId") +
" - " + jsonObject.getString("inputTime"), Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Kita memanggil method 'readJSONFeed()' dalam method 'doInBackground()', dan string JSON yang kita ambil dilewatkan ke dalam method 'onPostExecute()'. String JSON yang digunakan dalam latihan ini diambil dari: http://extjs.org.cn/extjs/examples/grid/survey.html

Untuk mendapatkan daftar object dalam string JSON, kita menggunakan class 'JSONArray', dan melewatkannya sebagai parameter di constructor class 'JSONArray'.

Method 'length()' akan mengembalikan jumlah object dalam object 'jsonArray'. Dengan daftar object yang disimpan dalam object 'jsonArray', kita membuat iterasi untuk mendapatkan masing-masing object dengan menggunakan method 'getJSONObject()':
/*tampilkan masing-masing isi json*/
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
Toast.makeText(getBaseContext(), jsonObject.getString("appeId") +
" - " + jsonObject.getString("inputTime"), Toast.LENGTH_SHORT).show();
}
Method 'getJSONObject()' akan mengembalikan tipe object 'JSONObject'. Untuk mendapatkan value dari pasangan key-value yang disimpan di dalam object, kita menggunakan method 'getString()' (atau bisa juga menggunakan method 'getInt()', 'getLong()', dan 'getBoolean()' untuk tipe data yang lain).

Terakhir, kita mengakses feed JSON secara asynchronous dengan menggunakan method 'execute()':
new ReadJSONFeedTask().execute("http://extjs.org.cn/extjs/examples/grid/survey.html");

No comments: