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