自定义test之java json字符串转为java对象

来源:互联网 发布:知乎@公众号提问 编辑:程序博客网 时间:2024/06/06 15:04
最近作者在上一篇java json字符串转map或list(http://blog.csdn.net/zqy1992/article/details/70189997)的基础上实现了把json字符串转为普通java对象的简单功能,还望大家批评指正。


private static <T> T parseObject(String input,Class<T> clazz) throws Exception{
if(input == null){
return null;
}
Map<String,Object> map = (Map<String, Object>) JsonPrase2Test.getObject(input);
return parseObjectImpl(map,clazz);

}

private static <T> T parseObjectImpl(Map<String,Object> map,Class<T> clazz) throws Exception{


if(map == null || map.size() <= 0){
return null;
}

Field[] fields = clazz.getDeclaredFields();
T t = (T) Class.forName(clazz.getName()).newInstance();
for(Field field : fields){
try{
PropertyDescriptor propertyDescriptor = new PropertyDescriptor(field.getName(), clazz);
Method setMechod = propertyDescriptor.getWriteMethod();
if(handlePrimitiveClass(field.getType(),setMechod,t,map.get(field.getName()))){

}else if(field.getType().isAssignableFrom(List.class)){
List objectlist = new ArrayList();
List valueList = (List) map.get(field.getName());

Type type = field.getGenericType();//得到其generic类型
if(type instanceof ParameterizedType){//如果是泛型

ParameterizedType parameterizedType = (ParameterizedType) type;//暂时只处理泛型是普通objectl类型(不处理泛型是list类型)
Class genericClass = (Class) parameterizedType.getActualTypeArguments()[0];
for(Object value:valueList){
objectlist.add(parseObjectImpl((Map<String, Object>) value, genericClass));
}else{
objectlist = valueList ;
}
setMechod.invoke(t,objectlist);
}
}else{//普通对象Object
setMechod.invoke(t,parseObjectImpl((Map<String, Object>) map.get(field.getName()),field.getType()));
}

}catch (Exception e){
System.out.println("处理属性"+ field.getName()+" 异常! exception="+e.getClass());
}


}
return t;

}


private static boolean handlePrimitiveClass(Class clazz,Method setMethod,Object obj,Object value) throws Exception {
try {

if(value == null){
 return true;
}
String str = value.toString();
if (clazz.isAssignableFrom(Integer.class) || clazz.isAssignableFrom(int.class)) {
setMethod.invoke(obj, Integer.valueOf(str));
} else if (clazz.isAssignableFrom(Double.class) || clazz.isAssignableFrom(double.class)) {
setMethod.invoke(obj, Double.valueOf(str));
} else if (clazz.isAssignableFrom(Float.class) || clazz.isAssignableFrom(Float.class)) {
setMethod.invoke(obj, Float.valueOf(str));
} else if (clazz.isAssignableFrom(Long.class) || clazz.isAssignableFrom(Long.class)) {
setMethod.invoke(obj, Long.valueOf(str));
} else if (clazz.isAssignableFrom(Short.class) || clazz.isAssignableFrom(Short.class)) {
setMethod.invoke(obj,Short.valueOf(str));
} else if (clazz.isAssignableFrom(Character.class) || clazz.isAssignableFrom(Character.class)) {
setMethod.invoke(obj,str);
} else if (clazz.isAssignableFrom(String.class) || clazz.isAssignableFrom(String.class)) {
setMethod.invoke(obj, str);
}else if (clazz.isAssignableFrom(Map.class)) {
setMethod.invoke(obj, value);
}else {
return false;
}
return true;
}catch (Exception e){
throw new Exception();
}

}

代码首先把json格式的字符串(这里默认是普通对象类型)转为map,根据反射获取要转为java对象的属性列表,根据属性名字在map查找然后把结果直接赋值。



0 0
原创粉丝点击