開源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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章