Java反射机制的运用-Json解析

    xiaoxiao2021-03-25  146

    大家好啊,好几天没写了,今天项目中json解析很是烦恼(Gson不可以用,原因后台爸爸们不规范),所以我就想要让原生json解析更快点,so,问题来了.

    /** * 这个方法用于调用对象的方法更新字段 * */ public <T> void invoke(T t,String key,Object value,Class valueClass){ try { String p = getFirstUpCAse(key); t.getClass().getMethod(p, valueClass).invoke(t,value); } catch (Exception e) { e.printStackTrace(); } }

    该方法是获取了JavaBean的方法,来动态的去更新字段。通过getFirstUpCAse()方法将json的key变换为–setKey的形式,这样就要求我们的Java实体承载bean必须规范。

    接下来,我们还需要对—{object,obj,obj}这种形式的json进行处理

    /** * 这个方法针对,{Obj,Obj,Obj,Obj} * */ public <T> T getBean(JSONObject obj,Class classzz){ T t = null; try { t = (T) classzz.newInstance(); Iterator<String> it = obj.keys(); while(it.hasNext()){ String key = it.next(); Object value = obj.get(key); if(value instanceof Integer)invoke(t, key, (Integer)value, Integer.class); if(value instanceof Boolean)invoke(t, key, (Boolean)value, Boolean.class); if(value instanceof String)invoke(t, key, (String)value, String.class); //else throw new Exception("sorry your method's parmeater is not support !"); } return t; } catch (Exception e) { e.printStackTrace(); } return t; }

    这里我们只对Interger,Boolean和String做了限定,这个应该足够了,后面的文章我还会更扩展功能的,现在就这3中类型。通过Class的newInstance()方法获取实体对象,在通过invoke()方法完成对象的字段的跟新。

    还要处理形如—[{},{},{}]此类的json,那么也比较简单,如下

    /** * 这个方法针对,[{},{},{}...] * */ public <T> List<T> getJavaBeanList(JSONArray array,Class classzz){ List<T> list = new ArrayList<>(); int size = array.size(); for(int i = 0;i<size;i++){ JSONObject ob = array.getJSONObject(i); list.add(getBean(ob, classzz)); } return list; }

    也还要针对如下的json格式–{x,x,x,x}

    /** * 这个方法针对,[Obj,Obj,Obj] * */ public List<Object> getJavaStringList(JSONArray array){ List<Object> list = new ArrayList<>(); int size = array.size(); for(int i = 0;i<size;i++){ list.add(array.get(i)); } return list; }

    这下就差不多了,现在我们来模拟项目中的场景,我用的php+javaSE来实现的。

    PHP代码:

    <?php /** * Created by PhpStorm. * User: Administrator * Date: 2017/3/7 0007 * Time: 下午 9:13 */ require 'User1.php'; $p = $_POST; $user = new User1(); $user->setAge((int)$p["age"]); $user->setSex($p["sex"]); $user->setPassword($p["password"]); $user->setName($p["name"]); $a = $user->toArray(); $b = array(); $bb = array(); $bb["state"] = 1; for ($i = 0;$i<10;$i++){ $b[$i]=$a; } $bb["data"] = $b; $bb["info"] = "success"; @header('content_type:text/html;charset=UTF-8'); echo json_encode($bb);

    简单的模拟的post请求,User1的toarray()函数如下,将所有的字段转化为array;

    public function toArray(){ return array("name"=>$this->name,"age"=>$this->age,"password"=>$this->password,"sex"=>$this->sex); }

    接下里看客户端如何实现

    public static void getData(){ OkHttpClient c = new OkHttpClient(); Request.Builder b = new Request.Builder(); RequestBody body = new FormBody.Builder() .add("password", "yzz123") .add("name", "yzz") .add("age", "23") .add("sex", "男") .build() ; b.post(body).url("http://127.0.0.1/yzz3-5/work_3_7/Login.php"); c.newCall(b.build()).enqueue(new Callback() { @Override public void onResponse(Call arg0, Response resp) throws IOException { // TODO Auto-generated method stub User u = null; try { u = User.class.newInstance(); } catch (InstantiationException | IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } String json = resp.body().string(); System.out.println(json); JSONObject ob = new JSONObject(); JSONObject oob = ob.fromObject(json); Iterator<String> it = oob.keys(); while(it.hasNext()){ String key = it.next(); Object o = oob.get(key); if(o instanceof JSONArray){ List<User.UserInfo> list = ReflectJavaBean.getInstance().getJavaBeanList((JSONArray)o,User.UserInfo.class); ReflectJavaBean.getInstance().invoke(u, key, list,List.class); }else{ Class valueClass = null; if(o instanceof Integer)valueClass = Integer.class; if(o instanceof String)valueClass = String.class; if(o instanceof Boolean)valueClass = Boolean.class; ReflectJavaBean.getInstance().invoke(u, key, o, valueClass); } } System.out.println("结果:"+u.toString()); } @Override public void onFailure(Call arg0, IOException arg1) { // TODO Auto-generated method stub } }); }

    运行效果:

    {"state":1,"data":[{"name":"yzz","age":23,"password":"yzz123","sex":"\u7537"},{"name":"yzz","age":23,"password":"yzz123","sex":"\u7537"},{"name":"yzz","age":23,"password":"yzz123","sex":"\u7537"},{"name":"yzz","age":23,"password":"yzz123","sex":"\u7537"},{"name":"yzz","age":23,"password":"yzz123","sex":"\u7537"},{"name":"yzz","age":23,"password":"yzz123","sex":"\u7537"},{"name":"yzz","age":23,"password":"yzz123","sex":"\u7537"},{"name":"yzz","age":23,"password":"yzz123","sex":"\u7537"},{"name":"yzz","age":23,"password":"yzz123","sex":"\u7537"},{"name":"yzz","age":23,"password":"yzz123","sex":"\u7537"}],"info":"success"} 结果:User [state=1, info=success, data=[UserInfo [name=yzz, password=yzz123, sex=男, age=23], UserInfo [name=yzz, password=yzz123, sex=男, age=23], UserInfo [name=yzz, password=yzz123, sex=男, age=23], UserInfo [name=yzz, password=yzz123, sex=男, age=23], UserInfo [name=yzz, password=yzz123, sex=男, age=23], UserInfo [name=yzz, password=yzz123, sex=男, age=23], UserInfo [name=yzz, password=yzz123, sex=男, age=23], UserInfo [name=yzz, password=yzz123, sex=男, age=23], UserInfo [name=yzz, password=yzz123, sex=男, age=23], UserInfo [name=yzz, password=yzz123, sex=男, age=23]]]

    这种做法减少了我们重复性工作,但是还不够,这篇文章就先写这么多,下次获更加的完善,做到跟Gson功能类似,大家晚安哦;

    转载请注明原文地址: https://ju.6miu.com/read-7548.html

    最新回复(0)