JSON Parser
JSON stands for JavaScript Object Notation and this is an independent data exchange format and is the best alternative for XML. In This chapter we will learn how to parse the JSON file and extract necessary information from it.
Android provides four different classes to manipulate JSON data and these classes are JSONArray, JSONObject, JSONTokenizer and JSONStringer.
So here first we need to identify the fields in the JSON data in which you are interested. For instance, In the JSON which is given below we are interested in getting temperature only.
{ "sys": { "country":"GB", "sunrise":1381107633, "sunset":1381149604 }, "weather":[ { "id":711, "main":"Smoke", "description":"smoke", "icon":"50n" } ], "main": { "temp":304.15, "pressure":1009, } }
JSON – Elements
An JSON file contains of many components and here is the table defining the components of an JSON file and their uses −
Sr.No | Component & description |
1 | Array([) In a JSON file the square bracket ([) represents a JSON array |
2 | Objects({) In a JSON file the curly bracket ({) represents a JSON object. |
3 | Key A JSON object contains a key that is just a string and it Pairs of key/value make up a JSON object |
4 | Value Each key has a value that could be string or integer or double e.t.c |
JSON – Parsing
To parse a JSON, we will create an object of JSONObject class and then specify a string containing JSON data to it. Its syntax is −
String in; JSONObject reader = new JSONObject(in);
The last step is to parse the JSON and the JSON file contains different objects with different key/value pairs e.t.c. So JSONObject has a separate function for parsing each of the components of a JSON file. Its syntax is given below −
JSONObject sys = reader.getJSONObject("sys"); country = sys.getString("country"); JSONObject main = reader.getJSONObject("main"); temperature = main.getString("temp");
The method getJSONObject returns the JSON object and The function getString returns the string value of the specified key.
Following is the content of the modified main activity java file src/MainActivity.java.
import android.os.AsyncTask; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.Toast; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; import java.util.HashMap; public class MainActivity extends AppCompatActivity { private String TAG = MainActivity.class.getSimpleName(); private ListView lv; ArrayList> contactList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); contactList = new ArrayList<>(); lv = (ListView) findViewById(R.id.list); new GetContacts().execute(); } private class GetContacts extends AsyncTask { @Override protected void onPreExecute() { super.onPreExecute(); Toast.makeText(MainActivity.this,"Json Data is downloading",Toast.LENGTH_LONG).show(); } @Override protected Void doInBackground(Void... arg0) { HttpHandler sh = new HttpHandler(); // Making a request to url and getting response String url = "http://api.androidhive.info/contacts/"; String jsonStr = sh.makeServiceCall(url); Log.e(TAG, "Response from url: " + jsonStr); if (jsonStr != null) { try { JSONObject jsonObj = new JSONObject(jsonStr); // Getting JSON Array node JSONArray contacts = jsonObj.getJSONArray("contacts"); // looping through All Contacts for (int i = 0; i < contacts.length(); i++) { JSONObject c = contacts.getJSONObject(i); String id = c.getString("id"); String name = c.getString("name"); String email = c.getString("email"); String address = c.getString("address"); String gender = c.getString("gender"); // Phone node is JSON Object JSONObject phone = c.getJSONObject("phone"); String mobile = phone.getString("mobile"); String home = phone.getString("home"); String office = phone.getString("office"); // tmp hash map for single contact HashMap contact = new HashMap<>(); // adding each child node to HashMap key => value contact.put("id", id); contact.put("name", name); contact.put("email", email); contact.put("mobile", mobile); // adding contact to contact list contactList.add(contact); } } catch (final JSONException e) { Log.e(TAG, "Json parsing error: " + e.getMessage()); runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(getApplicationContext(), "Json parsing error: " + e.getMessage(), Toast.LENGTH_LONG).show(); } }); } } else { Log.e(TAG, "Couldn't get json from server."); runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(getApplicationContext(), "Couldn't get json from server. Check LogCat for possible errors!", Toast.LENGTH_LONG).show(); } }); } return null; } @Override protected void onPostExecute(Void result) { super.onPostExecute(result); ListAdapter adapter = new SimpleAdapter(MainActivity.this, contactList, R.layout.list_item, new String[]{ "email","mobile"}, new int[]{R.id.email, R.id.mobile}); lv.setAdapter(adapter); } } }
Following is the modified content of the java file ie. HttpHandler.java.
import android.util.Log; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.ProtocolException; import java.net.URL; public class HttpHandler { private static final String TAG = HttpHandler.class.getSimpleName(); public HttpHandler() { } public String makeServiceCall(String reqUrl) { String response = null; try { URL url = new URL(reqUrl); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); // read the response InputStream in = new BufferedInputStream(conn.getInputStream()); response = convertStreamToString(in); } catch (MalformedURLException e) { Log.e(TAG, "MalformedURLException: " + e.getMessage()); } catch (ProtocolException e) { Log.e(TAG, "ProtocolException: " + e.getMessage()); } catch (IOException e) { Log.e(TAG, "IOException: " + e.getMessage()); } catch (Exception e) { Log.e(TAG, "Exception: " + e.getMessage()); } return response; } private String convertStreamToString(InputStream is) { BufferedReader reader = new BufferedReader(new InputStreamReader(is)); StringBuilder sb = new StringBuilder(); String line; try { while ((line = reader.readLine()) != null) { sb.append(line).append('\n'); } } catch (IOException e) { e.printStackTrace(); } finally { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } return sb.toString(); } }
Following is the modified content of the xml layout file ie. res/layout/activity_main.xml.
Following is the modified content of the xml layout file ie. res/layout/list_item.xml.
Following is the content of AndroidManifest.xml file.
Let’s try to run our app we have just modified and I assume we have created your AVD while doing environment setup and to run the app from Android studio we need to open one of your project’s activity files and click Run Eclipse Run Icon icon from the toolbar.