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;
@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);
}
@SuppressWarnings("unchecked")
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;
}
@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);
}
}