JSON解析服务端返回数据并封装赋值于实体类

Veronica ·
更新时间:2024-11-13
· 937 次阅读

       

前提:客户端开发的数据请求服务端获取,大部分返回的数据格式是json形式,所以为了减少每次用JSONObject类去解析,导致代码繁琐操作,如下封装了一个json解析实体类的工具进行实现,减少繁琐代码的解析操作,利于提高开发效率。此工具类只是针对一级json格式的解析,多级解析还待完善。

开发目的:游戏sdk的开发,避免使用第三方json解析,导致其他渠道也使用第三方json解析,接入时,会报jar包冲突或者版本对不上的问题,才考虑用原生来封装使用。

一、创建工具类对象

public class ReflectHelper { private Class cls; /** * 传过来的对象 */ private Object obj; private Hashtable getMethods = null; private Hashtable setMethods = null; public ReflectHelper(Object o) { obj = o; initMethods(); } public void initMethods() { getMethods = new Hashtable(); setMethods = new Hashtable(); 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()); 谢梁进 原创文章 38获赞 6访问量 2万+ 关注 私信 展开阅读全文
作者:谢梁进



服务端 JSON json解析 数据 封装 实体 实体类 赋值

需要 登录 后方可回复, 如果你还没有账号请 注册新账号