在安卓网络app开发中,由于服务器和客户端使用json字段串通信,但是android自带的json解析类不够强大,比如要实现一个users(装user的list)解析,json串如下,
{"state":"success","users":[{"id":12,"name":"sds","price":23.0},{"id":1,"name":"zhangsan","price":20.9},{"id":2,"name":"lisi","price":11.1},{"id":1,"name":"ganhua","price":21.0}]}
,state是自己加的一个请求状态,解析users需要拆装到各个属性,然后实例化化一个user,装入一个list,但是在实现不同的类,比如Person,Student,或者各种类,需要写重复的解析代码。
于是,有点想偷懒,进行代码重构,写了一个处理JSON字符串的工具类。
比如处理一个list,parseJsonList(String result, Class<?> c, String objName) 中Class<?> c是传入的class,通过反射进行对象的实例化以及属性设置(反射获取set方法,然后invoke该方法)。
package com.example.testjsonactivity;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
public class JSONUtil {
public <T> List parseJsonList(String result, Class<?> c, String objName) {
List<T> list = new ArrayList<T>();
try {
//构造JSONObject对象
JSONObject jo = new JSONObject(result);
if ("success".equals(jo.getString("state"))) { // state用于控制请求状态
//根据list名,获取JSONArray
JSONArray ja1 = jo.getJSONArray(objName);
for (int i = 0; i < ja1.length(); i++) {
JSONObject jo2 = ja1.getJSONObject(i);
T o = null;
try {
//实例化一个对象
o = (T) c.newInstance();
//获取class c的字段
Field[] fields = c.getDeclaredFields();
//根据字段名,获得属性,获取class c的set方法并调用
for (int j = 0; j < fields.length; j++) {
Field f = fields[j];
String fieldname = f.getName();
Method m = getSetMethod(c, fieldname);
m.invoke(o, jo2.get(fieldname));
}
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//加入对象o
list.add(o);
}
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
}
// 获取set方法
public static Method getSetMethod(Class objectClass, String fieldName) {
try {
Class[] parameterTypes = new Class[1];
Field field = objectClass.getDeclaredField(fieldName);
parameterTypes[0] = field.getType();
StringBuffer sb = new StringBuffer();
sb.append("set");
sb.append(fieldName.substring(0, 1).toUpperCase());
sb.append(fieldName.substring(1));
Method method = objectClass
.getMethod(sb.toString(), parameterTypes);
return method;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
然后在需要解析json串的地方, List<User> users=jsonutil.parseJsonList(result, User.class,"users");
如果是解析别的类,传入不同的class即可。