Android JSON Parser - Custom Library Like you, I am a programmer trying to make a living by developing apps. When it comes to Androi...
Android JSON Parser - Custom Library
Like you, I am a programmer trying to make a living by developing apps. When it comes to Android, I found my life a bit easier because of rich tools like IntelliJ IDEA used as the official Android IDE, well-written documentations, good supports, big community, etc. I could make a blog about good things of Android. But here in this blog, I got a bit of a problem: the problem of libraries.It made me crazy when finding myself repeating the same things over and over again. How come? I am still asking this question.
Recently, I worked on a project of making an Android app to read JSON data from a web service that stored data in MySQL. In the app, I wanted to read data from tbl_user, tbl_product, tbl_category, tbl_order etc. Basically, you need a class used as a model class to represent a table. Hence, you have four different classes with different attributes. To parse JSON to object, first you call a JSONArray class from org.json package to read a JSON text. Then you need a loop (for loop mostly) to read data from JSON and store it in each attributes of a class. Below is snippet of the codes:
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
...
try{
String jSonText =
"[{\"id\":\"1\",\"username\":\"sok\",\"password\":\"123\"}";
JSONArray jArray = new JSONArray(jSonText);
List<User> userList = new ArrayList<User>();
for(int i = 0; i < jArray.length() ; i++){
JSONObject jsObj = jArray.getJSONObject(i);
User user = new User();
user.id(Integer.parseInt(jsObj.getString("id")));
user.username(jsObj.getString("username"));
user.password(jsObj.getString("password"));
userList.add(user);
}//end for
} catch (JSONException e) {
//error message
}//end try
...
public class User{
public int id;
public String username;
public String password;
}
I have 4 tables so I had to write these same codes 4 times. This block of code repeats over and over again. I told myself there should be a better way. Then I looked for help, yes, on Google. I tried some keywords like "generic json parser arraylist" or "generic json converter arraylist" in Google, I was surprise to see the result which is less than 250,000 (on 2015-09-07). And you will see the top results are coming from StackOverlow. How come there is no link to an official Android library or Google library? So I had to go each questions and all answers in StackOverflow. I found some good answers but not complete. Then I need to work out with the puzzle, and finally I created a good generic class that can convert/parse a JSON text into an ArrayList or List of a generic class.So are you ready to make your life easier?
REUSABLE JSON CONVERTER TO GENERIC ARRAYLIST
Step 1 - Add GSON Library
This class uses GSON from Google. First you need to download the GSON jar file by visiting this website. Make sure you add it as a library by copying the jar file into libs folder > right clicking on it > choose Add as Library. Or a better way, just add a Gradle as shown below into your dependencies.compile 'com.google.code.gson:gson:2.2.4'
Step 2 - Create JsonConverter Class
This is the important class. This class consists of one method: ArrayList<T> toArrayList. But because some prefers a return type as List, I created another method List<T> toList. The two methods do exactly the same thing except the return type. What it does is taking a JSON String and using GSON to convert it. However, here we want it to convert to a list of any generic type. That's why you need to supply a Class<T> class as a second argument.import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
public class JsonConverter<T> {
public ArrayList<T> toArrayList(String jsonString, Class<T> clazz){
GsonBuilder builder = new GsonBuilder();
builder.setDateFormat("dd/MM/yy HH:mm:ss");
Gson gson = builder.create();
Type type = new ListParameterizedType(clazz);
ArrayList<T> list = gson.fromJson(jsonString, type);
return list;
}
public List<T> toList(String jsonString, Class<T> clazz) {
List<T> list = toArrayList(jsonString, clazz);
return list;
}
private static class ListParameterizedType implements ParameterizedType {
private Type type;
private ListParameterizedType(Type type) {
this.type = type;
}
@Override
public Type[] getActualTypeArguments() {
return new Type[] {type};
}
@Override
public Type getRawType() {
return ArrayList.class;
}
@Override
public Type getOwnerType() {
return null;
}
}
}
Step 3 - Add @SerializedName
In your model class, you should add @SerializedName on each attributes. See a sample code below:import com.google.gson.annotations.SerializedName;
public class Product {
@SerializedName("id")
public Integer id;
@SerializedName("username")
public String username;
@SerializedName("password")
public Double password;
}
Step 4 - Usage
To use it, what you have to do is to call toArrayList method and pass in a JSON text and a model class, e.g. User.String jSonText =
"[{\"id\":\"1\",\"name\":\"Sao\",\"username\":\"sok\",\"password\":\"123\"}]";
ArrayList<User> userList =
new JsonConverter<User>().toArrayList(json, User.class);
That's it. It is just one line of code. If you have another model, you repeat step 3 and step 4. It will save a lot of times and headache.DOWNLOAD
If you don't want to create the class in step 2 yourself, you can download a Jar file from my GitHub at https://github.com/kosalgeek/KGJsonConverter. However, please note that even though you download my library, you still need to add the GSON library as well. To do that, read step 1.Written by Oum Saokosal, KosalGeek, Top12Review.
