花了两个小时写的测试通过的json解析返回对象的封装,虽然很多人说gson很方便,不过我觉得自己弄清楚了用起来才灵活,希望高手能够指出问题共同进步。共享出来基本上都加了注释。
package com.angico.wts.util;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONObject;
/**
* JSON数据解析类
* @author ysj
*
*/
public class JSONParse {
/**
* 解析json方法
* @param jsonStr
*/
public <T> List<T> parse(Class<T> t,String jsonStr) {
// 返回的list
List<T> list = new ArrayList<T>();
// 接收json数据的实体对象
T objT = null;
try {
// String 转成json对线
JSONObject jo = new JSONObject(jsonStr);
// 获取最外层的状态等值
int status = JsonUtility.getInteger(jo, "Info", -1);
// 如果有数据 则继续往下解析
if(true) {
// 获取list层json 数组的数据
JSONArray jsonArray = JsonUtility.getJSONArray(jo, "List");
// 通过反射获取传过来的shitibean
Field[] fields = t.getDeclaredFields();
if(jsonArray != null) {
// 如果数组不为空则循环里面的数据取出里面内容
for(int i = 0; i < jsonArray.length(); i++) {
// 实例化对象接收json的值
objT = t.newInstance();
for(Field field : fields) {
// 循环获取实体类里面的方法名 该名作为获取json的key
JSONObject obj = jsonArray.getJSONObject(i);
// 通过key获取到json里面字段的值
String value = JsonUtility.getString(obj, field.getName(), "0");
// 设置知道对象里面
setValueByName(objT,field.getName(),value);
}
// 把单个对象放到list里面
list.add((T) objT);
}
}
}
} catch (Exception e) {
System.out.println(e);
}
return list;
}
/**
* 设置值到对应的泛型对象里面
* @param object
* @param name
* @param value
*/
private static void setValueByName(Object object,String name,Object value){
// 用变量名首字母大写 拼上set就是set方法名
String methodName = "set" + Character.toUpperCase(name.charAt(0)) + name.substring(1);
try {
// 通过set方法把值设置到对象里面
object.getClass().getMethod(methodName,value.getClass()).invoke(object, value);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package com.angico.wts.util;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONObject;
/**
* JSON数据解析类
* @author ysj
*
*/
public class JSONParse {
/**
* 解析json方法
* @param jsonStr
*/
public <T> List<T> parse(Class<T> t,String jsonStr) {
// 返回的list
List<T> list = new ArrayList<T>();
// 接收json数据的实体对象
T objT = null;
try {
// String 转成json对线
JSONObject jo = new JSONObject(jsonStr);
// 获取最外层的状态等值
int status = JsonUtility.getInteger(jo, "Info", -1);
// 如果有数据 则继续往下解析
if(true) {
// 获取list层json 数组的数据
JSONArray jsonArray = JsonUtility.getJSONArray(jo, "List");
// 通过反射获取传过来的shitibean
Field[] fields = t.getDeclaredFields();
if(jsonArray != null) {
// 如果数组不为空则循环里面的数据取出里面内容
for(int i = 0; i < jsonArray.length(); i++) {
// 实例化对象接收json的值
objT = t.newInstance();
for(Field field : fields) {
// 循环获取实体类里面的方法名 该名作为获取json的key
JSONObject obj = jsonArray.getJSONObject(i);
// 通过key获取到json里面字段的值
String value = JsonUtility.getString(obj, field.getName(), "0");
// 设置知道对象里面
setValueByName(objT,field.getName(),value);
}
// 把单个对象放到list里面
list.add((T) objT);
}
}
}
} catch (Exception e) {
System.out.println(e);
}
return list;
}
/**
* 设置值到对应的泛型对象里面
* @param object
* @param name
* @param value
*/
private static void setValueByName(Object object,String name,Object value){
// 用变量名首字母大写 拼上set就是set方法名
String methodName = "set" + Character.toUpperCase(name.charAt(0)) + name.substring(1);
try {
// 通过set方法把值设置到对象里面
object.getClass().getMethod(methodName,value.getClass()).invoke(object, value);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}