Learn to consume a REST Web Service and parse JSON result in Android
In mobiles applications, very often you should get data from a Web Service to update content displayed to users. For example, you can imagine a weather application that needs to request weather data from a remote server. Content getted can be under different formats but JSON format is one of the most used format with REST Web Service.
So, you’re going to learn how to consume a REST Web Service and how to parse JSON result to update an Android application.
1. Consume a REST Web Service
First, we need to select a REST Web Service to consume. Here, we choose to consume a Web Service provided by Youtube API. It lets developers to request for a list of videos URLs by entering a query. You can try the Web Service response by requesting the following URL :
http://gdata.youtube.com/feeds/api/videos?q=Android&v=2&max-results=20&alt=jsonc&hl=en
Here, you can note the following parameters :
- q to enter query
- v to select version of API
- max-results to limit the number of results
- alt to define the response format
- hl to define language of the response
JSON format of the response will be important in step 2 when you will parse result to get data.
To consume the REST Web Service, you’re going to use HttpClient API provided in standard by SDK Android. Client is designed thanks to HttpClient interface where as HTTP methods are designed thanks to HttpGet and HttpPost classes. A HTTP response is designed thanks to interface HttpResponse.
Here, you wanna make an Http Get request, so code will be like that :
public String requestContent(String url) { HttpClient httpclient = new DefaultHttpClient(); String result = null; HttpGet httpget = new HttpGet(url); HttpResponse response = null; InputStream instream = null; try { response = httpclient.execute(httpget); HttpEntity entity = response.getEntity(); if (entity != null) { instream = entity.getContent(); result = convertStreamToString(instream); } } catch (Exception e) { // manage exceptions } finally { if (instream != null) { try { instream.close(); } catch (Exception exc) { } } } return result; } public String convertStreamToString(InputStream is) { BufferedReader reader = new BufferedReader(new InputStreamReader(is)); StringBuilder sb = new StringBuilder(); String line = null; try { while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } } catch (IOException e) { } finally { try { is.close(); } catch (IOException e) { } } return sb.toString(); }
Content is read line by line via an InputStream instance. All is setted in a String that is called result of the Web Service call.
2. Parse JSON result
Now, you can get JSON data from Youtube by entering a query thanks to requestContent() method. Following step is to parse JSON result to manage content and update your application.
Data about videos will be stored in Video objects. A Video class is a simple POJO :
public class Video { private String title; private String description; private String link; private String picture; public Video(){ } public Video(String title, String description, String link, String picture){ this.title = title; this.description = description; this.link = link; this.picture = picture; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public String getLink() { return link; } public void setLink(String link) { this.link = link; } public String getPicture() { return picture; } public void setPicture(String picture) { this.picture = picture; } }
To parse the JSON content, you can use JSON standard API provided by Android SDK. All the APIs turn around 2 classes : JSONObject an JSONArray. Code to parse the content is here :
ArrayList<Video> videos = new ArrayList<Video>(); try { JSONObject json = new JSONObject(res); JSONObject dataObject = json.getJSONObject("data"); JSONArray items = dataObject.getJSONArray("items"); for (int i = 0; i < items.length(); i++) { JSONObject videoObject = items.getJSONObject(i); Video video = new Video(videoObject.getString("title"), videoObject.getString("description"), videoObject.getJSONObject("player") .getString("default"), videoObject.getJSONObject("thumbnail") .getString("sqDefault")); videos.add(video); } } catch (JSONException e) { // manage exceptions }
When parsing is done, you get a list of videos objects containing all the data you need for your application.
3. Use an Asynchronous Task to call Web Service
With a method to consume Web Service and other to parse JSON result, we must assemble all inside an asynchronous task that will proceed the call without blocking UI main thread. To achieve that, you can use an AsyncTask implementation like this :
private static final String URL = "http://gdata.youtube.com/feeds/api/videos?q=$QUERY$&v=2&max-results=20&alt=jsonc&hl=en"; // ... new AsyncTask<String, Void, String>() { @Override protected void onPreExecute() { mDialog = ProgressDialog.show(MainActivity.this, "Load in progress", "Wait ...", true, true); } @Override protected String doInBackground(String... params) { String realUrl = URL.replace("$QUERY$", "Android"); return requestContent(realUrl); } @Override protected void onPostExecute(String res) { videos = new ArrayList<Video>(); try { JSONObject json = new JSONObject(res); JSONObject dataObject = json.getJSONObject("data"); JSONArray items = dataObject.getJSONArray("items"); for (int i = 0; i < items.length(); i++) { JSONObject videoObject = items.getJSONObject(i); Video video = new Video(videoObject.getString("title"), videoObject.getString("description"), videoObject.getJSONObject("player") .getString("default"), videoObject.getJSONObject("thumbnail") .getString("sqDefault")); videos.add(video); } } catch (JSONException e) { // manage exceptions } mVideosAdapter = new VideosListAdapter(MainActivity.this, videos); mVideosLv.setAdapter(mVideosAdapter); // dismiss progress dialog Utils.dismissDialog(mDialog); } }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); // we target SDK > API 11
In onPreExecute() method, you could display a progress dialog to warn user that load is in progress. It’s good because this method is called in UI main thread. The Web Service call is made in doInBackground method which is called in a separated thread. Then, in onPostExecute() method, you get result from Web Service load and parse JSON. Note that for big object to parse, you could also put the parsing in doInBackground() method.
When list of videos is filled, you could choose to display data in a specific ListView widget in your application thanks to a VideosListAdapter.
4. Application demo
Like said previously, the main part of the job is done and you must just create a simple UI to display data loaded. Result should be like that :
4 Comments Already
Leave a Reply
You must be logged in to post a comment.
Hello,
What about network libraries like Volley, Retrofit or ION ?
For JSON deserialization to POJO why not using Gson which is a great library ?
Hello,
Thanks for your comment.
Goal of this tutorial was just to show a raw solution without dependecies.
Library you mention are great and if it will make a great tutorial in the future to show how to use in an Android application.
Be patient, it will come later :).
This is a clear explaination however I came across certain errors.Can you please post me the complete code?