開源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;
}
}
}