JSON is the best alternative to XML for storing data in files. It is easy to parse and access data stored in JSON format. Previously i explained parsing XML and today i am going to discuess parsing JSON data with an example.
The JSON Structure
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,. You can get this JSON data by accessinghttp://api.androidhive.info/contacts/
| {    "contacts": [        {                "id": "c200",                "name": "Ravi Tamada",                "email": "ravi@gmail.com",                "address": "xx-xx-xxxx,x - street, x - country",                "gender": "male",                "phone": {                    "mobile": "+91 0000000000",                    "home": "00 000000",                    "office": "00 000000"                }        },        {                "id": "c201",                "name": "Johnny Depp",                "email": "johnny_depp@gmail.com",                "address": "xx-xx-xxxx,x - street, x - country",                "gender": "male",                "phone": {                    "mobile": "+91 0000000000",                    "home": "00 000000",                    "office": "00 000000"                }        },        .        .        .        .  ]} | 
The difference between [ and { - (Square brackets and Curly brackets)
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 representsJSONObject. 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.
| packagecom.androidhive.jsonparsing;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.io.UnsupportedEncodingException;importorg.apache.http.HttpEntity;importorg.apache.http.HttpResponse;importorg.apache.http.client.ClientProtocolException;importorg.apache.http.client.methods.HttpPost;importorg.apache.http.impl.client.DefaultHttpClient;importorg.json.JSONException;importorg.json.JSONObject;importandroid.util.Log;publicclassJSONParser {    staticInputStream is = null;    staticJSONObject jObj = null;    staticString json = "";    // constructor    publicJSONParser() {    }    publicJSONObject getJSONFromUrl(String url) {        // Making HTTP request        try{            // defaultHttpClient            DefaultHttpClient httpClient = newDefaultHttpClient();            HttpPost httpPost = newHttpPost(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 = newBufferedReader(newInputStreamReader(                    is, "iso-8859-1"), 8);            StringBuilder sb = newStringBuilder();            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 = newJSONObject(json);        } catch(JSONException e) {            Log.e("JSON Parser", "Error parsing data "+ e.toString());        }        // return JSON String        returnjObj;    }} | 
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.
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 namesprivatestaticfinalString TAG_CONTACTS = "contacts";privatestaticfinalString TAG_ID = "id";privatestaticfinalString TAG_NAME = "name";privatestaticfinalString TAG_EMAIL = "email";privatestaticfinalString TAG_ADDRESS = "address";privatestaticfinalString TAG_GENDER = "gender";privatestaticfinalString TAG_PHONE = "phone";privatestaticfinalString TAG_PHONE_MOBILE = "mobile";privatestaticfinalString TAG_PHONE_HOME = "home";privatestaticfinalString TAG_PHONE_OFFICE = "office";// contacts JSONArrayJSONArray 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 instanceJSONParser jParser = newJSONParser();// getting JSON string from URLJSONObject json = jParser.getJSONFromUrl(url);try{    // Getting Array of Contacts    contacts = json.getJSONArray(TAG_CONTACTS);        // looping through All Contacts    for(inti = 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
In my previous tutorial Android ListView Tutorial i explained how to create listview and updating with list data. Below i am implementing same listview but the list data i am updating is from parsed JSON.
| packagecom.androidhive.jsonparsing;importjava.util.ArrayList;importjava.util.HashMap;importorg.json.JSONArray;importorg.json.JSONException;importorg.json.JSONObject;importandroid.app.ListActivity;importandroid.content.Intent;importandroid.os.Bundle;importandroid.util.Log;importandroid.view.View;importandroid.widget.AdapterView;importandroid.widget.AdapterView.OnItemClickListener;importandroid.widget.ListAdapter;importandroid.widget.ListView;importandroid.widget.SimpleAdapter;importandroid.widget.TextView;publicclassAndroidJSONParsingActivity extendsListActivity {    // url to make request        // JSON Node names    privatestaticfinalString TAG_CONTACTS = "contacts";    privatestaticfinalString TAG_ID = "id";    privatestaticfinalString TAG_NAME = "name";    privatestaticfinalString TAG_EMAIL = "email";    privatestaticfinalString TAG_ADDRESS = "address";    privatestaticfinalString TAG_GENDER = "gender";    privatestaticfinalString TAG_PHONE = "phone";    privatestaticfinalString TAG_PHONE_MOBILE = "mobile";    privatestaticfinalString TAG_PHONE_HOME = "home";    privatestaticfinalString TAG_PHONE_OFFICE = "office";    // contacts JSONArray    JSONArray contacts = null;    @Override    publicvoidonCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);                // Hashmap for ListView        ArrayList<HashMap<String, String>> contactList = newArrayList<HashMap<String, String>>();        // Creating JSON Parser instance        JSONParser jParser = newJSONParser();        // 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(inti = 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 = newHashMap<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 = newSimpleAdapter(this, contactList,                R.layout.list_item,                newString[] { TAG_NAME, TAG_EMAIL, TAG_PHONE_MOBILE }, newint[] {                        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(newOnItemClickListener() {            @Override            publicvoidonItemClick(AdapterView<?> parent, View view,                    intposition, longid) {                // 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 = newIntent(getApplicationContext(), SingleMenuItemActivity.class);                in.putExtra(TAG_NAME, name);                in.putExtra(TAG_EMAIL, cost);                in.putExtra(TAG_PHONE_MOBILE, description);                startActivity(in);            }        });    }} | 
 
Không có nhận xét nào:
Đăng nhận xét