现在的位置: 首页 > 综合 > 正文

Android中json的解析优化

2017年11月11日 ⁄ 综合 ⁄ 共 2439字 ⁄ 字号 评论关闭

在安卓网络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即可。 

抱歉!评论已关闭.