前提:客户端开发的数据请求服务端获取,大部分返回的数据格式是json形式,所以为了减少每次用JSONObject类去解析,导致代码繁琐操作,如下封装了一个json解析实体类的工具进行实现,减少繁琐代码的解析操作,利于提高开发效率。此工具类只是针对一级json格式的解析,多级解析还待完善。
开发目的:游戏sdk的开发,避免使用第三方json解析,导致其他渠道也使用第三方json解析,接入时,会报jar包冲突或者版本对不上的问题,才考虑用原生来封装使用。
一、创建工具类对象
public class ReflectHelper {
private Class cls;
/**
* 传过来的对象
*/
private Object obj;
private Hashtable<String, Method> getMethods = null;
private Hashtable<String, Method> setMethods = null;
public ReflectHelper(Object o) {
obj = o;
initMethods();
}
public void initMethods() {
getMethods = new Hashtable<String, Method>();
setMethods = new Hashtable<String, Method>();
cls = obj.getClass();
Method[] methods = cls.getMethods();
// 定义正则表达式,从方法中过滤出getter / setter 函数.
String gs = "get(\\w+)";
Pattern getM = Pattern.compile(gs);
String ss = "set(\\w+)";
Pattern setM = Pattern.compile(ss);
// 把方法中的"set" 或者 "get" 去掉,$1匹配第一个
String rapl = "$1";
String param;
for (int i = 0; i < methods.length; ++i) {
Method m = methods[i];
String methodName = m.getName();
if (Pattern.matches(gs, methodName)) {
param = getM.matcher(methodName).replaceAll(rapl).toLowerCase();
getMethods.put(param, m);
} else if (Pattern.matches(ss, methodName)) {
param = setM.matcher(methodName).replaceAll(rapl).toLowerCase();
setMethods.put(param, m);
} else {
// org.jeecgframework.core.util.LogUtil.info(methodName + " 不是getter,setter方法!");
}
}
}
//设置实体类的set方法并调用
public boolean setMethodValue(String property,Object object) {
Method m = setMethods.get(property.toLowerCase());
if (m != null) {
try {
// 调用目标类的setter函数
m.invoke(obj, object);
return true;
} catch (Exception ex) {
ex.printStackTrace();
return false;
}
}
return false;
}
}
二、创建json解析工具类
public class JSONUtils {
//{"code":1,"data":"正确数据","message":"请求正确"}
public static Object parseObject(String text,Object object){
ReflectHelper reflectHelper = new ReflectHelper(object);//创建工具类对象
try {
String data=text.substring(1,text.length()-1);
String[] dataArray=data.split(",");
for(int i=0;i<dataArray.length;i++){
Log.e("tag","===="+dataArray[i]);
String[] arr=dataArray[i].split(":");
for(int j=0;j<1;j++){
Log.e("tag","========="+arr[0].substring(1,arr[0].length()-1));
reflectHelper.setMethodValue(arr[0].substring(1,arr[0].length()-1),arr[1]);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return object;
}
三、实体类的声明,对应返回json数据的属性声明
public class OrderInfo {
private String message;
private String code;
private String data;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
四、json工具类的调用
OrderInfo info=(OrderInfo) JSONUtils.parseObject(json,new OrderInfo());