JSON is very light weight, structured, easy to parse and much human readable. JSON is best alternative to XML when your android app needs to interchange data with your server. If your app consuming XML data, you can always refer to Android XML Parsing Tutorial.
In this tutorial we are going to learn how to parse JSON in android using different ways, using java.net library and other third part libraries.
The Sample JSON
Following is the sample JSON that we are going to parse in this tutorial. This is very simple JSON which gives us list of contacts where each node contains contact information like name, email, address, gender and phone numbers.
You can get this JSON data by accessing https://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)
In general all the JSON nodes will start with a square bracket or with a curly bracket. The difference between [ and { is, the square bracket ([) represents starting of an JSONArray node whereas curly bracket ({) represents JSONObject. So while accessing these nodes we need to call appropriate method to access the data.
If your JSON node starts with [, then we should use getJSONArray() method. Same as if the node starts with {, then we should use getJSONObject() method.

1. Creating New Project
So let’s start by creating a new android project. We’ll build a simple app which fetches the json from url, parses it and displays the contacts in a list view. Here we’ll use import java.net libraries (which are natively supported in android) to make the http call and fetch the json from url.
1. Create a new project in Android Studio from File ⇒ New Project and fill out the required details.
2. As we are fetching the JSON by making HTTP calls, we need to add INTERNET permission in AndroidManifest.xml file. Open AndroidManifest.xml and add the following permission.
| <uses-permissionandroid:name="android.permission.INTERNET"/> | 
| <?xmlversion="1.0"encoding="utf-8"?>    package="info.androidhive.jsonparsing">    <uses-permissionandroid: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">        <activityandroid:name=".MainActivity">            <intent-filter>                <actionandroid:name="android.intent.action.MAIN"/>                <categoryandroid:name="android.intent.category.LAUNCHER"/>            </intent-filter>        </activity>    </application></manifest> | 
3. Create a class named HttpHandler.java and use the below code. Here makeServiceCall() makes http call to particular url and fetches the response. In our case, we use this to get the raw json from the url.
| packageinfo.androidhive.jsonparsing;importandroid.util.Log;importjava.io.BufferedInputStream;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.net.HttpURLConnection;importjava.net.MalformedURLException;importjava.net.ProtocolException;importjava.net.URL;/** * Created by Ravi Tamada on 01/09/16. * www.androidhive.info */publicclassHttpHandler {    privatestaticfinalString TAG = HttpHandler.class.getSimpleName();    publicHttpHandler() {    }    publicString makeServiceCall(String reqUrl) {        String response = null;        try{            URL url = newURL(reqUrl);            HttpURLConnection conn = (HttpURLConnection) url.openConnection();            conn.setRequestMethod("GET");            // read the response            InputStream in = newBufferedInputStream(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());        }        returnresponse;    }    privateString convertStreamToString(InputStream is) {        BufferedReader reader = newBufferedReader(newInputStreamReader(is));        StringBuilder sb = newStringBuilder();        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();            }        }        returnsb.toString();    }} | 
4. Before making the http call, let’s add a list view first in our view. Open the layout file of main activity (activity_main.xml) and add a ListView element.
| <?xmlversion="1.0"encoding="utf-8"?>    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="info.androidhive.jsonparsing.MainActivity">    <ListView        android:id="@+id/list"        android:layout_width="fill_parent"        android:layout_height="wrap_content"/></RelativeLayout> | 
5. Create another layout file named list_item.xml with following content. This will be used to render single list item view.
| <?xmlversion="1.0"encoding="utf-8"?>    android:layout_width="fill_parent"    android:layout_height="wrap_content"    android:orientation="vertical"    android:padding="@dimen/activity_horizontal_margin">    <TextView        android:id="@+id/name"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:paddingBottom="2dip"        android:paddingTop="6dip"        android:textColor="@color/colorPrimaryDark"        android:textSize="16sp"        android:textStyle="bold"/>    <TextView        android:id="@+id/email"        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:paddingBottom="2dip"        android:textColor="@color/colorAccent"/>    <TextView        android:id="@+id/mobile"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:textColor="#5d5d5d"        android:textStyle="bold"/></LinearLayout> | 
6. Open MainActivity.java and declare the necessary variables for the list view. If you haven’t worked with list view yet, Android ListView Tutorial will helps you in getting started.
| publicclassMainActivity extendsAppCompatActivity {    privateString TAG = MainActivity.class.getSimpleName();    privateProgressDialog pDialog;    privateListView lv;    // URL to get contacts JSON    ArrayList<HashMap<String, String>> contactList;    @Override    protectedvoidonCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        contactList = newArrayList<>();        lv = (ListView) findViewById(R.id.list);    }} | 
1.1 Downloading & Parsing the JSON
7. As we are getting the JSON by making HTTP call, I am adding a Async class GetContacts to make http calls on background thread. Add the following method in your main activity class.
In onPreExecute() method progress dialog is shown before making the http call.
In doInBackground() method, makeServiceCall() is called to get the json from url. Once the json is fetched, it is parsed and each contact is added to array list.
In onPostExecute() method the progress dialog is dismissed and the array list data is displayed in list view using an adapter.
Also note that I have used getJSONArray() or getJSONObject() method depending on the type of node.
| packageinfo.androidhive.jsonparsing;importandroid.app.ProgressDialog;importandroid.os.AsyncTask;importandroid.os.Bundle;importandroid.support.v7.app.AppCompatActivity;importandroid.util.Log;importandroid.widget.ListAdapter;importandroid.widget.ListView;importandroid.widget.SimpleAdapter;importandroid.widget.Toast;importorg.json.JSONArray;importorg.json.JSONException;importorg.json.JSONObject;importjava.util.ArrayList;importjava.util.HashMap;publicclassMainActivity extendsAppCompatActivity {    privateString TAG = MainActivity.class.getSimpleName();    privateProgressDialog pDialog;    privateListView lv;    // URL to get contacts JSON    ArrayList<HashMap<String, String>> contactList;    @Override    protectedvoidonCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        contactList = newArrayList<>();        lv = (ListView) findViewById(R.id.list);        newGetContacts().execute();    }    /**     * Async task class to get json by making HTTP call     */    privateclassGetContacts extendsAsyncTask<Void, Void, Void> {        @Override        protectedvoidonPreExecute() {            super.onPreExecute();            // Showing progress dialog            pDialog = newProgressDialog(MainActivity.this);            pDialog.setMessage("Please wait...");            pDialog.setCancelable(false);            pDialog.show();        }        @Override        protectedVoid doInBackground(Void... arg0) {            HttpHandler sh = newHttpHandler();            // Making a request to url and getting response            String jsonStr = sh.makeServiceCall(url);            Log.e(TAG, "Response from url: "+ jsonStr);            if(jsonStr != null) {                try{                    JSONObject jsonObj = newJSONObject(jsonStr);                    // Getting JSON Array node                    JSONArray contacts = jsonObj.getJSONArray("contacts");                    // looping through All Contacts                    for(inti = 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<String, String> contact = newHashMap<>();                        // 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(finalJSONException e) {                    Log.e(TAG, "Json parsing error: "+ e.getMessage());                    runOnUiThread(newRunnable() {                        @Override                        publicvoidrun() {                            Toast.makeText(getApplicationContext(),                                    "Json parsing error: "+ e.getMessage(),                                    Toast.LENGTH_LONG)                                    .show();                        }                    });                }            } else{                Log.e(TAG, "Couldn't get json from server.");                runOnUiThread(newRunnable() {                    @Override                    publicvoidrun() {                        Toast.makeText(getApplicationContext(),                                "Couldn't get json from server. Check LogCat for possible errors!",                                Toast.LENGTH_LONG)                                .show();                    }                });            }            returnnull;        }        @Override        protectedvoidonPostExecute(Void result) {            super.onPostExecute(result);            // Dismiss the progress dialog            if(pDialog.isShowing())                pDialog.dismiss();            /**             * Updating parsed JSON data into ListView             * */            ListAdapter adapter = newSimpleAdapter(                    MainActivity.this, contactList,                    R.layout.list_item, newString[]{"name", "email",                    "mobile"}, newint[]{R.id.name,                    R.id.email, R.id.mobile});            lv.setAdapter(adapter);        }    }} | 
If you run the project, you can see json data populated into list view as shown in the below image.

2. Json Parsing using Library
The above method is very easy for simpler json. If the json is very complex, it is better to consider the third party libraries as they are much faster and reliable. Below are the popular libraries used to parse the json.
2.1 Using Volley Library
Volley HTTP library provides easy way to make networks calls. In Android JSON parsing using Volley you can learn how to do that same in easy way using volley networking library which provides you lot of advantages like success/error callback methods and cache options.
2.2 Using Retrofit Library
Retrofit is much popular than volley. The parsing is done using jackson libraries in which you just have to create models for json nodes and the library automatically converts the json into appropriate objects. Go through Android Working with Retrofit HTTP Library which explains in detail about retrofit library.
| Updated On | 27th Dec 2013 (Content Update, Bug fixes) | 
| 1st Sep 2016 (Content Update, Bug fixes, latest libraries) | 









