>>分享Java编程技术,对《Java面向对象编程》等书籍提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 28929 个阅读者 刷新本主题
 * 贴子主题:  Java反射机制的运用-Json解析 回复文章 点赞(0)  收藏  
作者:日月光华    发表时间:2019-10-13 12:06:26     消息  查看  搜索  好友  邮件  复制  引用

                                       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
  Java面向对象编程-->按面向对象开发的基础范例
  JavaWeb开发-->JavaWeb应用入门(Ⅱ)
  JSP与Hibernate开发-->使用JPA和注解
  Java网络编程-->对象的序列化与反序列化
  精通Spring-->
  Vue3开发-->绑定表单
  我是如何把一个15分钟的程序优化到了10秒的
  Java关键字final、static使用总结
  用注解去代替if-else的技巧
  靠一个HashMap的讲解打动了头条面试官
  HashMap中 get 和 put 操作的具体过程
  内部类的编程练习题
  Java并发之volatile关键字内存可见性问题
  java中的Static、final、Static final各种用法
  好消息:《Java网络编程核心技术详解》出版
  java常见的几种调用机制:同步调用,异步调用,回调
  正则表达式:运算符优先级
  java 支持分词的高性能拼音转换工具,速度是 pinyin4j 的两倍
  Java入门实用代码:向文件写入字符串
  Java入门实用代码:字符串替换
  Eclipse中怎么一键去除java项目中的信息打印语句
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。