开源Json处理工具是如何帮我们解析Json的

开源Json处理工具是如何帮我们解析Json的
最近是用了开源的解析Json 的工具,发现解析json特别的方便所以研究了一下。他的原理。我觉得原理其实也不难。就是利用了反射机制。当然了他内部肯定又用到了其他牛b的东西。我没有看源码。
我们使用Json工具, 解析Json的时候一般会传一个Json数组的字符串 一个是bean 的class 对象。为什么需要bean的class对象就是要用反射。
关于反射的知识大家可一百度下。我这里就不详细说了(详细解释我也不会(⊙﹏⊙))
我大致说下我研究出来的几个解析步骤
第一步获取bean 字节码对象

Class cs=t; //获取bean的字节码 t是方法传递过来的class对象

第二步 正常解析Jsonarray
第三步在Jsonarray解析循环里创建bean对象并通过反射获取字段同时解析到的数据设置给字段
大概的步骤就是这些。
(1) 反射 new 一个bean 对象

  Class<T> instance =cs.newInstance() 

(2) 反射获取bean 里面的字段这里很关键

 Field[] field=instance.getDeclaredFields() 

(3) 要设置 暴力反射 因为不设置的话可能没法给属性set 值

 field.setAccessible(true);

(4) 判断字段的类型 他是String 啊 还是int 啊 还是别的什么玩意 ,然后根据字段名字解析Json获取value 设置给对应的属性。(所以很多时候我们必须将bean 的属性名字与Json 的key保持一致因为不这样你的任何Json工具都不好使)

if(field.getType().isInstance(StringType)){ //判断
                                 String str=jo.getString(field.getName());
                                 field.set(tinstance,str); //两个该参数 第一个表示字段所在的类的对象 。第二个是字段的值
                             }

经过 以上步骤一个简单的解析Json工具就完成了。下面贴上完整代码。有需要的同学可一拿过来。在自己进行一下扩展。

public class JsonUtils {
    private String StringType="";
    private int intType=0;
        public<T>  List<T> getJsonArray(String jsonArray,Class<T> t){
            try {
                Class<T>  cs=t;  //获取class 字节码
                List<T> tList=new ArrayList<T>();
                JSONArray ja=new JSONArray(jsonArray);
                int length=ja.length();
                for(int i=0;i<length;i++){
                    JSONObject jo=ja.getJSONObject(i);
                    T tinstance = cs.newInstance();//创建改class 的对象
                    Field[] fields = cs.getDeclaredFields();
                         for(int j=0;j<fields.length;j++){
                             Field field = fields[j];
                             field.setAccessible(true);//暴力反射 
                             if(field.getType().isInstance(StringType)){ //判断
                                 String str=jo.getString(field.getName());
                                 field.set(tinstance,str); //两个该参数 第一个表示字段所在的类的对象 。第二个是字段的值
                             }else if(field.getType().isInstance(intType)){
                                 field.set(tinstance, 3);
                             }
                         }
                         tList.add(tinstance);
                }
                return tList;
            }catch(Exception e) {
                e.printStackTrace();
                return null;
            }


        }
}
发布了32 篇原创文章 · 获赞 30 · 访问量 4万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章