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.

Have not tried this yet, but seems like an elegant solution. I was looking at gson, but was turned away because it uses the toString method for conversion. This solution allows to defying the json conversion in any location.

I am using this JSONHandler.java to parse json object returned from server into java beans in one of my android application. I have tested my functionality on 3 different devices, it works fine only for 2 and in one device it is not able to parse. Following are the errors it throws after debugging1. model not present -> Type not present exception