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

最近作者在上一篇 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查找然后把结果直接赋值。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值