Android解析Json数据(二)—使用反射机制

网络传输中很多时候都会使用到JSon数据,每次都要根据key去解析实在是太繁琐、而且容易出错。这个可以通过java中的反射机制来解决,写一个公用的解析类而一劳永逸。

import java.lang.reflect.Field;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.util.Log;

/**
 * json 解析工具
 * 
 * @author Kevin
 * 
 */
public class JsonUtil {

	private static final String TAG = "jsonUtil";
	private JSONObject jsonObject;

	public void setJsonObject(JSONObject jsonObject) {
		this.jsonObject = jsonObject;
	}

	public JsonUtil(String json) {
		jsonObject = getJsonObject(json);
		if (jsonObject == null) {
			Log.e(TAG, "jsonobject is null");
		}
	}

	public JsonUtil() {
		super();
	}

	/**
	 * 得到一个jsonObject对象
	 * 
	 * @param json
	 *            json string
	 * @return JOSNObject
	 */
	public static JSONObject getJsonObject(String json) {
		JSONObject jsonObject = null;
		try {
			jsonObject = new JSONObject(json);
		} catch (JSONException e) {
			Log.e(TAG, "create jsonobject exception");
			e.printStackTrace();
		}
		return jsonObject;
	}

	/**
	 * 根据关键字Key获取String对象
	 * 
	 * @param json
	 *            json data
	 * @param key
	 *            param
	 * @return String data
	 * @throws JSONException
	 */
	public String getString(String key) throws JSONException {
		if (jsonObject != null) {
			return jsonObject.getString(key);
		} else {
			return null;
		}

	}

	/**
	 * 根据关键字Key获取Int对象
	 * @param key
	 * @return int 
	 * @throws JSONException
	 */
	public int getInt(String key) throws JSONException {
		if (jsonObject != null) {
			return jsonObject.getInt(key);
		} else {
			return -1;
		}

	}

	/**
	 * 根据关键字Key获取Double对象
	 * @param key
	 * @return double 
	 * @throws JSONException
	 */
	public double getDouble(String key) throws JSONException {
		if (jsonObject != null) {
			return jsonObject.getDouble(key);
		} else {
			return -1;
		}

	}

	/**
	 *Key 值等于类名时
	 *通过反射解析得到c对象
	 * @param c
	 * @return object
	 * @throws Exception
	 */
	public Object getObject(Class<?> c) throws Exception {
		if (jsonObject != null) {
			return getObject(c.getSimpleName(), c);
		} else {
			return null;
		}
	}

	/**
	 *
	 * 通过Key值反射解析得到c对象
	 * 
	 * @param jsonObject
	 * @param key
	 *            query key
	 * @param c
	 *            class
	 * @return object
	 * @throws Exception
	 */
	public Object getObject(String key, Class<?> c) throws Exception {
		if (jsonObject != null) {
			return getObject(jsonObject, key, c);
		} else {
			return null;
		}
	}

	public Object getObject(JSONObject jsonObject, Class<?> c) throws Exception {
		return getObject(jsonObject, c.getSimpleName(), c);
		// return getObject(jsonObject, c.getSimpleName().toLowerCase(), c);
	}

	/**
	 * 从jsonObject中解析Key值,得到C对象
	 * 
	 * @param jsonObject
	 * @param key
	 *            query key
	 * @param c
	 *            class
	 * @return object
	 * @throws Exception
	 */
	public Object getObject(JSONObject jsonObject, String key, Class<?> c)
			throws Exception {
		// Log.e(TAG, "key ==  " + key);
		Object bean = null;

		if (jsonObject != null) {
			JSONObject jo = null;
			if (key != null) {
				jo = jsonObject.getJSONObject(key);
			} else {
				jo = jsonObject;
			}
			if (jo != null) {
				if (c.equals(null)) {
					Log.e(TAG, "class is null");
					bean = jo.get(key);
				} else {
					bean = c.newInstance();

					// Field[] fs = c.getFields();
					Field[] fs = c.getDeclaredFields();
					for (int i = 0; i < fs.length; i++) {
						Field f = fs[i];
						f.setAccessible(true);
						Type type = f.getGenericType();
						String value = null;
						//解析List
						if(f.getType().equals(List.class)){
							String fClassName = toUpperCaseFirstOne(f
									.getName());
							String fClass = "com.example."
									+ fClassName;
								f.set(bean,getList(jo.getJSONArray(fClassName),fClassName,
												Class.forName(fClass)));
								continue;
						}
						

						value = jo.getString(f.getName());

						
//						 Log.e(TAG, f.getName() + "=" + value);

						if (type.equals(int.class)) {
							if(value.length() == 0){
								f.setInt(bean, 0);
							}else{
								f.setInt(bean, Integer.valueOf(value));
							}
							
						} else if (type.equals(double.class)) {
							if(value.length() == 0){
								f.setDouble(bean, 0);
							}else{
								f.setDouble(bean, Double.valueOf(value));
							}
						} else {
							f.set(bean, value);
						}

					}
				}
			} else {
				Log.e(TAG, "in jsonobject not key ");
			}
		} else {
			Log.e(TAG, "current param jsonobject is null");
		}
		return bean;
	}

	/**
	 *等同getList(String key ,Class<?> c) key值 =c的类名 
	 * 
	 * @param c
	 * @return
	 * @throws Exception
	 */
	public List<Object> getList(Class<?> c) throws Exception {
		return getList(c.getSimpleName(), c);
	}

	/**
	 * 解析数组,返回一个链表
	 * 
	 * @param key
	 * @param c
	 *            List<E>,
	 * @return list
	 * @throws Exception
	 */
	public List<Object> getList(String key, Class<?> c) throws Exception {
		if (jsonObject != null) {
			JSONArray jsonArray = jsonObject.getJSONArray(key);
			return getList(jsonArray, key, c);
		} else {
			return null;
		}
	}

	/**
	 * 从jsonArray中解析得到List
	 * 
	 * @param jsonArray
	 * @param key
	 * @param c
	 * @return
	 * @throws Exception
	 */
	public List<Object> getList(JSONArray jsonArray, String key, Class<?> c)
			throws Exception {
		List<Object> list = null;

		if (!jsonArray.isNull(0)) {
			list = new ArrayList<Object>();
			for (int i = 0; i < jsonArray.length(); i++) {
				JSONObject jsObject = jsonArray.getJSONObject(i);
				Object object = getObject(jsObject, null, c);
				list.add(object);
			}
		}

		return list;
	}
	/**
	*第一个字母转化成大写
	*
	*/
	private String toUpperCaseFirstOne(String s) {
		if (Character.isUpperCase(s.charAt(0)))
			return s;
		else
			return (new StringBuilder())
					.append(Character.toUpperCase(s.charAt(0)))
					.append(s.substring(1)).toString();
	}
	
	/**
	 * @param jsonObject
	 * @param key
	 * @return
	 */
	public static String getString(JSONObject jsonObject,String key){
		String str  =null; 
		try {
			str = jsonObject.getString(key);
		} catch (JSONException e) {
			return null;
		}
		return  str;
	}
	/**
	 * @param jsonObject
	 * @param key
	 * @return
	 */
	public static int getInt(JSONObject jsonObject,String key){
		int arg  = -1; 
		try {
			arg = jsonObject.getInt(key);
		} catch (JSONException e) {
			return -1;
		}
		return  arg;
	}
	/**
	 * @param jsonObject
	 * @param key
	 * @return
	 */
	public static JSONObject getJsonObject(JSONObject jsonObject,String key){
		JSONObject object = null; 
		try {
			object = jsonObject.getJSONObject(key);
		} catch (JSONException e) {
			return null;
		}
		return  object;
	}
	/**
	 * @param jsonObject
	 * @param key
	 * @return
	 */
	public static JSONObject getJsonObject(String json,String key){
		JSONObject object = null; 
		JSONObject jsonObject = getJsonObject(json);
		object = getJsonObject(jsonObject,key);	
		return  object;
	}
	/**
	 * @param jsonObject
	 * @param key
	 * @return
	 */
	public static JSONArray getJSONArray(JSONObject jsonObject,String key){
		JSONArray object = null; 
		try {
			object = jsonObject.getJSONArray(key);
		} catch (JSONException e) {
			return null;
		}
		return  object;
	}
	/**
	 * @param jsonObject
	 * @param key
	 * @return
	 */
	public static JSONArray getJSONArray(String json,String key){
		JSONArray object = null; 
		JSONObject jsonObject = getJsonObject(json);
		object = getJSONArray(jsonObject, key);
		return  object;
	}
	

}


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值