How to process JSON within Android?

1. Android and JSON

1.1. Android and JSON

JSON is a very condense data exchange format. The Android platform includes the json.org libraries which allow to work easily with JSON files.

1.2. JSON Example: Twitter

Twitter is a great source for JSON. You can just call a URI and retrieve JSON. Here are some examples:

Table 1. Twitter URIs

URI Description
https://api.twitter.com/1/statuses/user_timeline/vogella.json Get the timeline of user vogella.
http://search.twitter.com/search.json?q=android Search for the term “android” on Twitter.

 

Please note that some URIs return a JSONObject object while others return a JSONArray.

2. Reading JSON

Create a new Android project called de.vogella.android.twitter.json with the package de.vogella.android.twitter.json and the activity called ParseJSON.

Create the following coding for the activity. This will download the twitter feed for the Twitter user called vogella and write the number of entries and the text messages to the Android log file.

 

package de.vogella.android.twitter.json;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONObject;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class ParseJSON extends Activity {
/** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    # Just for testing, allow network access in the main thread
    # NEVER use this is productive code
    StrictMode.ThreadPolicy policy = new StrictMode.
    ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy); 

    setContentView(R.layout.main);
    String readTwitterFeed = readTwitterFeed();
    try {
      JSONArray jsonArray = new JSONArray(readTwitterFeed);
      Log.i(ParseJSON.class.getName(),
          "Number of entries " + jsonArray.length());
      for (int i = 0; i < jsonArray.length(); i++) {
        JSONObject jsonObject = jsonArray.getJSONObject(i);
        Log.i(ParseJSON.class.getName(), jsonObject.getString("text"));
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  public String readTwitterFeed() {
    StringBuilder builder = new StringBuilder();
    HttpClient client = new DefaultHttpClient();
    HttpGet httpGet = new HttpGet("http://twitter.com/statuses/user_timeline/vogella.json");
    try {
      HttpResponse response = client.execute(httpGet);
      StatusLine statusLine = response.getStatusLine();
      int statusCode = statusLine.getStatusCode();
      if (statusCode == 200) {
        HttpEntity entity = response.getEntity();
        InputStream content = entity.getContent();
        BufferedReader reader = new BufferedReader(new InputStreamReader(content));
        String line;
        while ((line = reader.readLine()) != null) {
          builder.append(line);
        }
      } else {
        Log.e(ParseJSON.class.toString(), "Failed to download file");
      }
    } catch (ClientProtocolException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
    return builder.toString();
  }
}

 

Warning

The code example allows network access in the main thread to simplify the code snippet. In reality always ensure that network access is done in a background thread.

To run this example assign the uses-permission to your AndroidManifest.xml for “android.permission.INTERNET”.

3. Write JSON

Writing JSON is very simple. Just create the JSONObject or JSONArray and use the toString() method.

 

public void writeJSON() {
  JSONObject object = new JSONObject();
  try {
    object.put("name", "Jack Hack");
    object.put("score", new Integer(200));
    object.put("current", new Double(152.32));
    object.put("nickname", "Hacker");
  } catch (JSONException e) {
    e.printStackTrace();
  }
  System.out.println(object);
}