json util

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.apache.commons.beanutils.BeanUtils;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;

/**
* json工具类
* @author zhuzhongming.tw
*
*/
public final class JsonUtils {

private static Gson gson = new GsonBuilder().setDateFormat(
"yyyy-MM-dd HH:mm:ss").disableHtmlEscaping().create();

public JsonUtils() {
}

/**
* keyClass is String 新增了Map和List两种支持,对象内容还是只支持String,如果是其他格式的需要转化
*
* @param <T>
* @param json
* @param valueClass
*            support
*            Short,Integer,Long,Float,Double,BigDecimal,Boolean,Date
*            ,default String
* @return
*/
public static <T> Map<String, T> mapFromJson(String json,
Class<T> valueClass) {
Type type;
if (Short.class.equals(valueClass))
type = new TypeToken<Map<String, Short>>() {
}.getType();
else if (Integer.class.equals(valueClass))
type = new TypeToken<Map<String, Integer>>() {
}.getType();
else if (Long.class.equals(valueClass))
type = new TypeToken<Map<String, Long>>() {
}.getType();
else if (Float.class.equals(valueClass))
type = new TypeToken<Map<String, Float>>() {
}.getType();
else if (Double.class.equals(valueClass))
type = new TypeToken<Map<String, Double>>() {
}.getType();
else if (BigDecimal.class.equals(valueClass))
type = new TypeToken<Map<String, BigDecimal>>() {
}.getType();
else if (Boolean.class.equals(valueClass))
type = new TypeToken<Map<String, Boolean>>() {
}.getType();
else if (Date.class.equals(valueClass))
type = new TypeToken<Map<String, Date>>() {
}.getType();
else if (Map.class.equals(valueClass))
type = new TypeToken<Map<String, Map<String, String>>>() {
}.getType();
else if (List.class.equals(valueClass))
type = new TypeToken<Map<String, List<String>>>() {
}.getType();
else
type = new TypeToken<Map<String, String>>() {
}.getType();
return gson.fromJson(json, type);
}

/**
*
* @param <T>
* @param json
* @param clazz
*            List元素的类型 support
*            Short,Integer,Long,Float,Double,BigDecimal,Boolean,Date
*            ,default String
*
*            update:
*            针对复杂对象的List做了特殊处理,但仍然要求对象的原始数据都是一样的类型,但可以通过映射的bean来达到所需要的效果
* @return
*/
public static <T> List<T> listFromJson(String json, Class<T> clazz) {
Type type = null;
if (Short.class.equals(clazz))
type = new TypeToken<List<Short>>() {
}.getType();
else if (Integer.class.equals(clazz))
type = new TypeToken<List<Integer>>() {
}.getType();
else if (Long.class.equals(clazz))
type = new TypeToken<List<Long>>() {
}.getType();
else if (Float.class.equals(clazz))
type = new TypeToken<List<Float>>() {
}.getType();
else if (Double.class.equals(clazz))
type = new TypeToken<List<Double>>() {
}.getType();
else if (BigDecimal.class.equals(clazz))
type = new TypeToken<List<BigDecimal>>() {
}.getType();
else if (Boolean.class.equals(clazz))
type = new TypeToken<List<Boolean>>() {
}.getType();
else if (Date.class.equals(clazz))
type = new TypeToken<List<Date>>() {
}.getType();

if (null != type) {
return gson.fromJson(json, type);
} else {
type = new TypeToken<List<Map<String, String>>>() {
}.getType();
List<T> ret = new ArrayList<T>();
List<Map<String, String>> tempObj = gson.fromJson(json, type);
for (Map<String, String> item : tempObj) {
try {
T obj = clazz.newInstance();
for (String key : item.keySet()) {
String value = item.get(key);
BeanUtils.setProperty(obj, key, value);
}
ret.add(obj);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
return ret;
}
}

public static String toJson(Object o) {
return gson.toJson(o);
}

/*public static void main(String[] args) {
String target = "[{'className':'com.taobao.wap.common.wapdomainreplacer.fliter.TtidFilter','key':'ttid'},{'className':'com.taobao.wap.common.wapdomainreplacer.fliter.SidUrlFilter','key':'sid'}]";
System.out.println(listFromJson(target, UrlFilterConfigure.class));

RestInput restInput = new RestInput();
restInput.setApi("aa");
System.out.println(JsonUtils.toJson(restInput));

}*/
}

你可能感兴趣的:(json)