Wednesday, 6 July 2011

Parse JSON returned from Flickr Services

Further work on the last exercise "Access Flickr API using HttpClient", a method ParseJSON() is implemented to parse the JSON returned from Flickr Services.



Parse JSON returned from Flickr Services



package com.exercise.AndroidFlickr;



import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.Reader;



import org.apache.http.HttpEntity;

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.JSONException;

import org.json.JSONObject;



import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

import android.widget.TextView;



public class AndroidFlickrActivity extends Activity {



/*

* FlickrQuery = FlickrQuery_url

* + FlickrQuery_per_page

* + FlickrQuery_nojsoncallback

* + FlickrQuery_format

* + FlickrQuery_tag + q

* + FlickrQuery_key + FlickrApiKey

*/



String FlickrQuery_url = "http://api.flickr.com/services/rest/?method=flickr.photos.search";

String FlickrQuery_per_page = "&per_page=1";

String FlickrQuery_nojsoncallback = "&nojsoncallback=1";

String FlickrQuery_format = "&format=json";

String FlickrQuery_tag = "&tags=";

String FlickrQuery_key = "&api_key=";



// Apply your Flickr API:

// www.flickr.com/services/apps/create/apply/?

String FlickrApiKey = "2155e9406043b7494453105eec99ae37";



EditText searchText;

Button searchButton;

TextView textQueryResult, textJsonResult;



/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);



searchText = (EditText)findViewById(R.id.searchtext);

searchButton = (Button)findViewById(R.id.searchbutton);

textQueryResult = (TextView)findViewById(R.id.queryresult);

textJsonResult = (TextView)findViewById(R.id.jsonresult);



searchButton.setOnClickListener(searchButtonOnClickListener);

}



private Button.OnClickListener searchButtonOnClickListener

= new Button.OnClickListener(){



public void onClick(View arg0) {

// TODO Auto-generated method stub

String searchQ = searchText.getText().toString();

String searchResult = QueryFlickr(searchQ);

textQueryResult.setText(searchResult);

String jsonResult = ParseJSON(searchResult);

textJsonResult.setText(jsonResult);

}};



private String QueryFlickr(String q){



String qResult = null;



String qString =

FlickrQuery_url

+ FlickrQuery_per_page

+ FlickrQuery_nojsoncallback

+ FlickrQuery_format

+ FlickrQuery_tag + q

+ FlickrQuery_key + FlickrApiKey;



HttpClient httpClient = new DefaultHttpClient();

HttpGet httpGet = new HttpGet(qString);



try {

HttpEntity httpEntity = httpClient.execute(httpGet).getEntity();



if (httpEntity != null){

InputStream inputStream = httpEntity.getContent();

Reader in = new InputStreamReader(inputStream);

BufferedReader bufferedreader = new BufferedReader(in);

StringBuilder stringBuilder = new StringBuilder();



String stringReadLine = null;



while ((stringReadLine = bufferedreader.readLine()) != null) {

stringBuilder.append(stringReadLine + "\n");

}



qResult = stringBuilder.toString();



}



} catch (ClientProtocolException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}



return qResult;

}



private String ParseJSON(String json){



String jResult = null;



try {

JSONObject JsonObject = new JSONObject(json);

JSONObject Json_photos = JsonObject.getJSONObject("photos");

JSONArray JsonArray_photo = Json_photos.getJSONArray("photo");



//We have only one photo in this exercise

JSONObject FlickrPhoto = JsonArray_photo.getJSONObject(0);



jResult = "\nid: " + FlickrPhoto.getString("id") + "\n"

+ "owner: " + FlickrPhoto.getString("owner") + "\n"

+ "secret: " + FlickrPhoto.getString("secret") + "\n"

+ "server: " + FlickrPhoto.getString("server") + "\n"

+ "farm: " + FlickrPhoto.getString("farm") + "\n"

+ "title: " + FlickrPhoto.getString("title") + "\n";



} catch (JSONException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}



return jResult;



}

}





Modify main.xml to add a TextView, jsonresult, to display the parsed JSON data.

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

>

<TextView

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="@string/hello"

/>

<EditText

android:id="@+id/searchtext"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

/>

<Button

android:id="@+id/searchbutton"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="Search"

/>

<TextView

android:id="@+id/queryresult"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

/>

<TextView

android:id="@+id/jsonresult"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

/>

</LinearLayout>





next:

- Load photo from Flickr



Related article:

- Get Time Zone of location, from web service of www.geonames.org




No comments:

Post a Comment