Project: Coffee-Framework
package coffee.binding;
 
import java.lang.reflect.Type; 
import java.math.BigDecimal; 
import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.List; 
 
import com.google.gson.Gson; 
import com.google.gson.JsonArray; 
import com.google.gson.JsonElement; 
import com.google.gson.JsonParser; 
 
public class DefaultDataParser implements IConverter { 
 
    /* (non-Javadoc)
     * @see coffee.binding.IConverter#decode(java.lang.Object, java.lang.Class, java.lang.reflect.Type[]) 
     */
 
    @Override 
    public Object decode(Object serializedData, Class<?> type, Type[] genericTypes) { 
        if (!String.class.isInstance(serializedData)) 
            return serializedData; 
 
        if (Double.class.isAssignableFrom(type)) 
            return Double.parseDouble((String) serializedData); 
 
        else if (Float.class.isAssignableFrom(type)) 
            return Float.parseFloat((String) serializedData); 
 
        else if (Boolean.class.isAssignableFrom(type)) 
            return Boolean.parseBoolean((String) serializedData); 
 
        else if (Byte.class.isAssignableFrom(type)) 
            return Byte.parseByte((String) serializedData); 
 
        else if (Integer.class.isAssignableFrom(type)) 
            return Integer.parseInt((String) serializedData); 
 
        else if (Short.class.isAssignableFrom(type)) 
            return Short.parseShort((String) serializedData); 
 
        else if (Long.class.isAssignableFrom(type)) 
            return Long.parseLong((String) serializedData); 
 
        else if (BigDecimal.class.isAssignableFrom(type)) 
            return new BigDecimal((String)serializedData); 
 
        else if (List.class.isAssignableFrom(type)) 
         return parseAsArrayList((String)serializedData, (Class<?>)genericTypes[0]); 
 
        return new Gson().fromJson((String)serializedData, type); 
    } 
 
 /**
  * @param serializedData 
  * @param type 
  * @return 
  */
 
    @SuppressWarnings("unchecked"
 public <T> Object parseAsArrayList(String serializedData, T type) { 
  ArrayList<T> newArray = new ArrayList<T>(); 
  Gson gson = new Gson(); 
 
  JsonElement json = new JsonParser().parse(serializedData); 
  JsonArray array= json.getAsJsonArray(); 
  Iterator<JsonElement> iterator = array.iterator(); 
 
  while(iterator.hasNext()){ 
      JsonElement json2 = (JsonElement)iterator.next(); 
   T object = (T) gson.fromJson(json2, (Class<?>)type); 
      newArray.add(object); 
  
 
  return newArray; 
 
 
 /* (non-Javadoc)
  * @see coffee.binding.IConverter#encode(java.lang.Object) 
  */
 
 @Override 
 public String encode(Object object) { 
  if (object == null
   return null
  else if (String.class.isInstance(object)) 
            return (String)object; 
  else if (object.getClass().getPackage().getName().equals("java.lang")) 
   return String.valueOf(object); 
 
  return new Gson().toJson(object); 
 
 
}