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));
}*/
}
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工具类的使用,包括如何将JSON字符串转换为特定类型的Map和List,以及如何从复杂的对象列表中解析数据。通过实例演示了在不同场景下灵活运用JSON工具类的方法。
1万+

被折叠的 条评论
为什么被折叠?



