I am taking an example of following JSON which will give you list of contacts and each contact will have details like name, email, address, phone number ertc,.
If you observe normally JSON data will have square brackets and curly brackets. The difference between [ and { is, the square bracket represents starting of an JSONArray node whereas curly bracket represents JSONObject. While accessing these elements we need to call different methods to access these nodes.
In your project create a class file and name it as JSONParser.java. The parser class has a method which will make http request to get JSON data and returns a JSONObject.
JSONParser.java :
If you observe normally JSON data will have square brackets and curly brackets. The difference between [ and { is, the square bracket represents starting of an JSONArray node whereas curly bracket represents JSONObject. While accessing these elements we need to call different methods to access these nodes.
- Writing JSON Parser Class
In your project create a class file and name it as JSONParser.java. The parser class has a method which will make http request to get JSON data and returns a JSONObject.
JSONParser.java :
package
com.androidhive.jsonparsing;
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.HttpPost;
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();
HttpPost
httpPost =
new
HttpPost(url);
HttpResponse
httpResponse = httpClient.execute(httpPost);
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,
"iso-8859-1"
),
8
);
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.e(
"Buffer
Error"
,
"Error
converting result "
+
e.toString());
}
// try parse the
string to a JSON object
try
{
jObj =
new
JSONObject(json);
}
catch
(JSONException e)
{
Log.e(
"JSON
Parser"
,
"Error
parsing data "
+ e.toString());
}
// return JSON
String
return
jObj;
}
}
- Parsing JSON Data
Once you created parser class next thing is to know how to use that class.
Below i am explaining how to parse the json (taken in this example) using the
parser class.
1. In the contacts json we have items like
name, email, address, gender and phone numbers. So first thing is to store all
these node names in variables. Open your main activity class and declare store
all node names in static variables.
// url to make
request
// JSON Node
names
private
static
final
String TAG_CONTACTS =
"contacts"
;
private
static
final
String TAG_ID =
"id"
;
private
static
final
String TAG_NAME =
"name"
;
private
static
final
String TAG_EMAIL =
"email"
;
private
static
final
String TAG_ADDRESS =
"address"
;
private
static
final
String TAG_GENDER =
"gender"
;
private
static
final
String
TAG_PHONE =
"phone"
;
private
static
final
String
TAG_PHONE_MOBILE =
"mobile"
;
private
static
final
String
TAG_PHONE_HOME =
"home"
;
private
static
final
String
TAG_PHONE_OFFICE =
"office"
;
// contacts
JSONArray
JSONArray
contacts =
null
;
2. Next step to is to use parser class to get JSONObject and
looping through each json item. Below i am creating an instance of JSONParser
class and using for loop i am looping through each json item and finally storing
each json data in variable.
// Creating
JSON Parser instance
JSONParser
jParser =
new
JSONParser();
// getting
JSON string from URL
JSONObject json =
jParser.getJSONFromUrl(url);
try
{
// Getting Array of Contacts
contacts = json.getJSONArray(TAG_CONTACTS);
// looping through
All Contacts
for
(
int
i =
0
; i < contacts.length(); i++){
JSONObject c =
contacts.getJSONObject(i);
// Storing each
json item in variable
String id =
c.getString(TAG_ID);
String name =
c.getString(TAG_NAME);
String email =
c.getString(TAG_EMAIL);
String address =
c.getString(TAG_ADDRESS);
String gender =
c.getString(TAG_GENDER);
// Phone number
is agin JSON Object
JSONObject phone =
c.getJSONObject(TAG_PHONE);
String mobile =
phone.getString(TAG_PHONE_MOBILE);
String home =
phone.getString(TAG_PHONE_HOME);
String office =
phone.getString(TAG_PHONE_OFFICE);
}
}
catch
(JSONException e)
{
e.printStackTrace();
}
- Parsing JSON data and updating into ListView
Below i am implementing same listview but the list data i am updating is from
parsed JSON.
AndroidJSONParsing.java
package
com.androidhive.jsonparsing;
import
java.util.ArrayList;
import
java.util.HashMap;
import
org.json.JSONArray;
import
org.json.JSONException;
import
org.json.JSONObject;
import
android.app.ListActivity;
import
android.content.Intent;
import
android.os.Bundle;
import
android.util.Log;
import
android.view.View;
import
android.widget.AdapterView;
import
android.widget.AdapterView.OnItemClickListener;
import
android.widget.ListAdapter;
import
android.widget.ListView;
import
android.widget.SimpleAdapter;
import
android.widget.TextView;
public
class
AndroidJSONParsing
extends
ListActivity
{
// url to make
request
// JSON Node
names
private
static
final
String TAG_CONTACTS =
"contacts"
;
private
static
final
String TAG_ID =
"id"
;
private
static
final
String TAG_NAME =
"name"
;
private
static
final
String TAG_EMAIL =
"email"
;
private
static
final
String TAG_ADDRESS =
"address"
;
private
static
final
String TAG_GENDER =
"gender"
;
private
static
final
String TAG_PHONE =
"phone"
;
private
static
final
String TAG_PHONE_MOBILE =
"mobile"
;
private
static
final
String TAG_PHONE_HOME =
"home"
;
private
static
final
String TAG_PHONE_OFFICE =
"office"
;
// contacts
JSONArray
JSONArray contacts =
null
;
@Override
public
void
onCreate(Bundle
savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Hashmap for
ListView
ArrayList<HashMap<String, String>> contactList =
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 Contacts
contacts =
json.getJSONArray(TAG_CONTACTS);
// looping
through All Contacts
for
(
int
i =
0
; i < contacts.length();
i++){
JSONObject c
= contacts.getJSONObject(i);
//
Storing each json item in variable
String id =
c.getString(TAG_ID);
String name
= c.getString(TAG_NAME);
String email
= c.getString(TAG_EMAIL);
String
address = c.getString(TAG_ADDRESS);
String
gender = c.getString(TAG_GENDER);
// Phone
number is agin JSON Object
JSONObject
phone = c.getJSONObject(TAG_PHONE);
String
mobile = phone.getString(TAG_PHONE_MOBILE);
String home
= phone.getString(TAG_PHONE_HOME);
String
office = phone.getString(TAG_PHONE_OFFICE);
//
creating new HashMap
HashMap<String, String> map =
new
HashMap<String,
String>();
// adding
each child node to HashMap key => value
map.put(TAG_ID, id);
map.put(TAG_NAME, name);
map.put(TAG_EMAIL, email);
map.put(TAG_PHONE_MOBILE, mobile);
// adding
HashList to ArrayList
contactList.add(map);
}
}
catch
(JSONException e)
{
e.printStackTrace();
}
/**
* Updating
parsed JSON data into ListView
*
*/
ListAdapter adapter
=
new
SimpleAdapter(
this
,
contactList,
R.layout.list_item,
new
String[] { TAG_NAME, TAG_EMAIL, TAG_PHONE_MOBILE },
new
int
[] {
R.id.name, R.id.email, R.id.mobile });
setListAdapter(adapter);
// selecting
single ListView item
ListView lv =
getListView();
// Launching new
screen on Selecting Single ListItem
lv.setOnItemClickListener(
new
OnItemClickListener()
{
@Override
public
void
onItemClick(AdapterView<?> parent, View
view,
int
position,
long
id) {
//
getting values from selected ListItem
String name
= ((TextView) view.findViewById(R.id.name)).getText().toString();
String cost
= ((TextView) view.findViewById(R.id.email)).getText().toString();
String
description = ((TextView)
view.findViewById(R.id.mobile)).getText().toString();
//
Starting new intent
Intent in =
new
Intent(getApplicationContext(),
SingleMenuItemActivity.
class
);
in.putExtra(TAG_NAME, name);
in.putExtra(TAG_EMAIL, cost);
in.putExtra(TAG_PHONE_MOBILE, description);
startActivity(in);
}
});
}
}
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.