আন্ড্রয়েডে JSON Parsing এ হাতেখড়ি

Java তে JSON Parsing এ যে ধাপগুলো মনে রাখা প্রয়োজন
(১) JSON এর URL থেকে  আমরা যে HTTP Response/String টা JSON Object তৈরি করতে ব্যবহার করবো তা Http Request এর Response থেকে read করা।
(২) Http Response এর contents গুলো String হিসেবে Store করা।
(৩) Java তে নতুন JSONObject  আগের Store করা String দিয়ে তৈরি করা। eg. JSONObject jsonObj= new JSONObject(String);
(৪) JSON Array এর নাম দিয়ে JSONObject থেকে JSONArray বের করে আনা। eg. JSONArray jsonArr = jsonObj.getJSONArray(“name_of_the_array”);
(৫) এখন যে JSON Array টা পাওয়া যাবে তার প্রতিটা index এ আলাদা আলাদা JSON Object থাকবে। ফলে আমরা আবার Array থেকে JSON Object বের করে নিয়ে আসতে পারব।
eg. JSONObject tempJsonObj = jsonArr.getJSONObject(index);
এখানে index হল Integer Value যা JSON Array এর Element এর index number বোঝায়। যেমন সাধারন Array এর 5 number index এর data পেতে হলে আমাদের Array[5] লিখতে হয়।
(৬) JSONObject এর Attribute গুলো Key-Value হিসেবে থাকে। এখন প্রতিটা আলাদা আলাদা JSONObject থেকে Key এর নাম ব্যবহার করে আমরা Value বের করে নিয়ে আসতে পারি।
eg. String nameValue = tempJsonObj.getString(“key_of_name”);

আমি Internet ঘেঁটে JSON Parsing এর যে Tutorial গুলো পেয়েছি তাতে প্রায় সব জায়গাতেই একই কাজ করা হয়েছে। কোন কোন Blog এ দেখলাম While loop দিয়ে Document এর লাইন বাই লাইন Read করে StringBuilder/StringBuffer Class ব্যবহার করা হয়েছে। আমি আমার টিউটোরিয়াল এ JSON Parsing এর কোডগুলো কমিয়ে এনেছি, নতুনদের বোঝার সুবিধার্থে।

এখানে একটা ব্যাপার বলে রাখা ভাল Android API Level 11 (Honeycomb) এ “NetworkOnMainThreadException” যুক্ত করা হয়েছে তাই API Level 10 এর পরের ভার্শনগুলোতে Main Activity তে অথবা অন্যভাবে বলতে গেলে Application এর Main Thread এ Network Operation করলে Application ঠিক ভাবে চলবে  না। Android Application এর Responsiveness এজন্য আলাদা Thread অথবা Network Operation গুলো AsyncTask এ করা উচিত। কিন্তু Forcely আমরা StrictMode (API Level > 9) এ Main Thread এর ভিতরে Network Operation Allow করতে পারি।

JSON দেখতে  https://raw.github.com/tushroy/TutorialFiles/master/test.json এরকম।

সম্পূর্ণ Tutorial এর Project Source Code  https://github.com/tushroy/JsonAsyncTuto/archive/master.zip  থেকে Download করে নিতে পারেন।

প্রথমেই আমাদের JSONParser CLass  যা আমাদের URL থেকে JSONObject return করার জন্য ব্যবহার করা হবে।
JSONParser.java
[java]
package json.tushar.tutorial;

import java.io.IOException;

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

public class JSONParser {
JSONObject jsonObj;

public JSONParser(String url) throws ParseException,
ClientProtocolException, JSONException, IOException {
// My ultimate constructor
jsonObj = new JSONObject(EntityUtils.toString(new DefaultHttpClient()
.execute(new HttpGet(url)).getEntity()));
}

public JSONObject getJSONObject() {
return jsonObj;
}

public static JSONObject getJSONObject(String url)
throws ClientProtocolException, IOException, JSONException {

DefaultHttpClient httpClient = new DefaultHttpClient();
HttpUriRequest req = new HttpGet(url);
HttpResponse resp = httpClient.execute(req);
HttpEntity entity = resp.getEntity();
String temp = EntityUtils.toString(entity);
JSONObject obj = new JSONObject(temp);
return obj;

}
}
[/java]

আমাদের MainActivity Class এখানে বলে রাখা দরকার আমরা ব্যাপারটা সহজভাবে বোঝার জন্য যদি Main Thread এ Network Operation/JSON Parsing করতে চাই তাহলে jsonMainThreadNetworkOperation(); এর Comment উঠিয়ে নিয়ে পরের দুই লাইন Comment করে দিতে হবে, মানে JsonAsyncUiUpdater backGroundUITask = new JsonAsyncUiUpdater(MainActivity.this); এবং backGroundUITask.execute(jsonUrl); এ comment বসিয়ে নিলে হবে।

MainActivity.java
[java]
package json.tushar.tutorial;

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

import android.app.Activity;
import android.os.Bundle;
import android.os.StrictMode;
import android.widget.TextView;

public class MainActivity extends Activity {

String jsonUrl = "https://raw.github.com/tushroy/TutorialFiles/master/test.json";
String jsonDataAfterParsing;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

// jsonMainThreadNetworkOperation();

JsonAsyncUiUpdater backGroundUITask = new JsonAsyncUiUpdater(MainActivity.this);
backGroundUITask.execute(jsonUrl);

}

private void jsonMainThreadNetworkOperation() {
// extra. code segment for StrictMode
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
.permitAll().build();

StrictMode.setThreadPolicy(policy);
}
// extra code segment ends

// Network Operation and JSON Parsing Starts
try {
// getting JSONObject using JSONParser Class
JSONObject mainJsonObj = JSONParser.getJSONObject(jsonUrl);

// getting the JSONArray out of the mainJsonObj
JSONArray jsonArray = mainJsonObj.getJSONArray("data");
// here our json array name is "data"
// visit this url to get understand
// https://raw.github.com/tushroy/TutorialFiles/master/test.json"

int arrayindex = 4;
// getting JSONObject out of jsonArray using array index
JSONObject tempJsonObject = jsonArray.getJSONObject(arrayindex);
// we have retrieve json object of index 4 from json array

// "name" or "id"
jsonDataAfterParsing = tempJsonObject.getString("name");
// Retrieving json data using attribute name, you can try "id"

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

TextView display = (TextView) findViewById(R.id.display);
display.setText(jsonDataAfterParsing);

}
}
[/java]

JsonAsyncUiUpdater Class JsonAsyncUiUpdater.java
[java]
package json.tushar.tutorial;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;

import org.apache.http.client.ClientProtocolException;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.os.AsyncTask;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;

public class JsonAsyncUiUpdater extends AsyncTask<String, Void, JSONObject> {
private Activity mContext;
private TextView display;
private ListView lView;

public JsonAsyncUiUpdater(Activity mContext) {
// without getting Activity context we can not use
// findViewById inside AsyncTask
this.mContext = mContext;
display = (TextView) mContext.findViewById(R.id.display);
lView = (ListView) mContext.findViewById(R.id.listView);
}

@Override
protected JSONObject doInBackground(String… urlStrs) {
// doing stuffs on background after completing, automatically
// onPostExecute method is called
JSONObject jsonObjResult = null;
try {
jsonObjResult = JSONParser.getJSONObject(urlStrs[0]);
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
return jsonObjResult;
}
@Override
protected void onPostExecute(JSONObject result) {
// this method is called after doInBackground()
// method completed successfully
String jsonArrayName = "data";
String jsonAttribName = "name";
String jsonAttribId = "id";

String nameStr = null;
String idStr = null;

JSONArray jsonArr = null;

try {
// getting json array out of JSONObject result
jsonArr = result.getJSONArray(jsonArrayName);
} catch (JSONException e) {
e.printStackTrace();
}

// creating array list hash map for storing json parsed data/values
ArrayList<HashMap<String, String>> arrList = new ArrayList<HashMap<String, String>>();

for (int index = 0; index < jsonArr.length(); index++) {
try {
// getting json object from array index
JSONObject tempJsonObj = jsonArr.getJSONObject(index);

// getting value of attribute using key/attribute names
nameStr = tempJsonObj.getString(jsonAttribName);
idStr = tempJsonObj.getString(jsonAttribId);

// creating a HashMap<Key,Value>
HashMap<String, String> hashMap = new HashMap<String, String>();
// storing data in key value pair into hash map
// using hashmap.put(key,value)
hashMap.put(jsonAttribName, nameStr);
hashMap.put(jsonAttribId, idStr);

// adding hash map to the array list
arrList.add(hashMap);

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

// Updating task for Application UI starts here

// Creating list adapter for list view using our hashmap array list
ListAdapter entriesAdapter = new SimpleAdapter(mContext, arrList,
android.R.layout.two_line_list_item, new String[] {
jsonAttribName, jsonAttribId }, new int[] {
android.R.id.text1, android.R.id.text2 });
// SimpleAdapter parameters: Context, List<? extends Map<String,?>>,
// int android.R resource type,String[] from hash map key names,
// int[] to android.R resource type where to put

lView.setAdapter(entriesAdapter);

display.setText("Updated!");
}

}
[/java]

Layout File main.xml
[xml]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<TextView
android:id="@+id/display"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="Not Updated!" />

<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</ListView>

</LinearLayout>
[/xml]

AndroidManifest.xml file
[xml]
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="json.tushar.tutorial"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
android:minSdkVersion="9"
android:targetSdkVersion="16" />

<uses-permission android:name="android.permission.INTERNET" />

<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="JsonTutoTushar"
android:theme="@style/AppTheme" >
<activity
android:name="json.tushar.tutorial.MainActivity"
android:label="JsonTutoTushar" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />

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

</manifest>
[/xml]

Json Android Tutorial
Json Android Tutorial

Incoming search terms:

  • www tushroy com
  • www tushry com
  • হাতেখড়ি
  • হাতেখড়ি apps
  • www toshroy com
  • www tushruy com
  • হাতেখড়ি

Tushar Roy

Software Engineer (Backend engineer), Android Developer,

Leave a Reply

Your email address will not be published. Required fields are marked *


*