|
Java反射机制的运用-Json解析
大家好:
/**
* 这个方法用于调用对象的方法更新字段
* */
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]]]
本文转自:https://blog.csdn.net/qq_22271479/article/details/60885421
程序猿的技术大观园:www.javathinker.net
|
|