自定义test之java json字符串转为java对象
2017-04-16 01:27
393 查看
最近作者在上一篇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查找然后把结果直接赋值。
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查找然后把结果直接赋值。
相关文章推荐
- java将对象转为json字符串
- JAVA中如何将一个json形式的字符串转为json对象
- java对象、List转为json格式的数据(最后是json字符串格式,不是json对象)
- java中json包的使用以及字符串,map,list,自定义对象之间的相互转换
- JSON对象反序列化为Java对象的时候自定义Date类型的字符串格式
- 自定义test之java json字符串转map或list
- java中json包的使用以及字符串,map,list,自定义对象之间的相互转换
- Json对象与Json字符串的转化、JSON字符串与Java对象的转换
- Json字符串与java对象互转(Java版本)
- 【问题-java-json】josn的发送与接收(全)解析json对象与字符串在js中的区别,以及后端spring该如何接收?
- JSON字符串转换JAVA对象例子。
- JSON 字符串 与 java 对象的转换
- JSON 字符串 与 java 对象的转换
- java如何将json字符串转换为对象
- json字符串转成java的map与list复合对象的解决方法
- json 转为java对象
- c# json字符串转为对象
- Gson在java对象和json字符串之间转换
- android java对象道json字符串的转化
- Gson在java对象和json字符串之间转换