Tuesday, April 12, 2011

JSON to Java Bean conversion for Android

I have written a small add-on for inbuilt JSON Lib of Android (org.json.*). Android's in-build JSON library is very permeative and provides just the basic functionalities. There is no Tokenize functionality which can automatically convert a JSON string into its relevant Java Bean class.

Though there are few alternate open source libraries like jackson-json, gson etc. But the inbuilt JSON library of Android is pretty simple to use and with this add-on you'll be able to get the missing flavor of auto-bean conversion.

How to use it ?
Please download the JSONHandler.java and include in your Android project source code. It provides an important method parse() which can convert a JSON string into Java Bean class.
It uses Java re-factoring, so Bean class field name and JSON property name should exactly match. Let's look into how to parse a simple JSON structure-
String jsonString = "{name: 'Jon Smith', id: 1234, " +
    "address: {cityName: 'San Diego', pinCode:345, latitude: 23.789, longitude: 78.965}," +
                    "}";
To parse above JSON structure you need to create a Bean class- Person.java having following properties and their Get/Set methods-
String name;
int id;
Address address;
As you can see Address is again a custom class- Address.java having following properties and their Get/Set methods-
String cityName;
int pinCode;
double latitude;
double longitude;

Once you define above 2 bean classes, you can use following piece of code to parse the JSON string into above bean class-
Person person = (Person)(new JSONHandler().parse(jsonString, Person.class, "com.prasanta"));
In the above code piece, "com.prasanta" is the name of base package under which Bean classes are defined.

Let's take an example where the JSON String itself is an Array-
String jsonString = "messages: [{id: 1, sub: 'Hi1', msg: 'I am here1'}, {id: 2, sub: 'Hi2', msg: 'I am here2'}]";
Above information represents an array of Message objects. Structure of Message.java (with Get/Set methods)-
int id;
String sub;
String msg;

JSONHandler.parse() method accepts only JSON Object and not JSONArray. So, we need to parse this array and pass individual JSON Object to the parse()-
JSONObject object = (JSONObject) new JSONTokener(json_resp.getResponseMessage()).nextValue();
JSONArray messages = object.getJSONArray("messages");

 for(int i=0; i LT messages.length(); i++){
    JSONObject message = messages.getJSONObject(i);
    Message msg = (Message)new JSONHandler().parse(message.toString(), Message.class, "com.prasanta");
 }
In the above code piece, "com.prasanta" is the name of base package under which Bean classes are defined.

So, how good is that :-) You can enhance the parsing logic as per your requirement. 

Thursday, April 7, 2011

Overriding In JavaScript

Here I'll explain the usage of a powerful keyword/programming structure of JavaScript, "prototype". It is one of the member variable of Function object and Function object is kind of Supper class for any function that you write in JavaScript. Every function in Javascript is of type Function object.

"prototype" provides really a powerful and simple way of extending JavaScript Object and Override their existing functions. Prototype provides additional look up chain for variable and method definition search.

So, lets take an example, say there is a JavaScript object Person having First and Last name and we want to override  the default toString() method of prototype property. toString() displays string representation of any object.
               function Person(fname, lname){
                       this.fname = fname;
                       this.lname = lname;
               }
               Person.prototype.toString = function(){
return "Person Name: "+ fname +" "+ lname;
               };
 Usage-
var person = new Person("Alan", "Miers");
alert(person);

Now, lets define the Person object with 2 methods displayName() and reverseName().
                function Person(fname, lname){
this.fname = fname;
this.lname = lname;
};
// Add methods
Person.prototype.fullName = function(){
return this.fname + " "+ this.lname;
};
Person.prototype.reverseName = function(){
return this.lname + " "+ this.fname;
};


A good source of JavaScript guide- Mozilla Development Network