Androidにおけるjsonからobjectおよびobjectからjsonへの解析

4702 ワード

モバイルアプリケーションの開発では,jsonオブジェクトが解析しやすく,リソース占有が小さいため,広範なアプリケーションが得られ,1つのjsonオブジェクトをobjectに直接解析する方法やobjectオブジェクトを直接jsonオブジェクトに変換する方法が応用されることが多い.Googleにはgsonのライブラリがありますが、使用中に解析エラーが発生した場合、空のポインタを返しただけで、エラーの原因をさらに提示していないことに気づきました.このように、デバッグプログラムやインタフェースをデバッグする際に不便になります.考えてみると、自分で方法を実現しました.効果だけでなく、アドバイスをお願いします.多く指摘して、絶えず改善することができることを望みます.
package com.xxx.xxxxxxxx;

import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
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 org.json.JSONStringer;

import android.util.Log;

final public class JSONTools {

	final public static Object json2Object(JSONObject jsonObject, Class> cls) {

		if (jsonObject == null || cls == null) {
			throw new NullPointerException("json2Object(JSONObject jsonObject, Class> cls), parameters "
					+ (jsonObject == null ? "jsonObject is null" : "cls is null"));
		}

		Object retData = null;
		try {
			retData = cls.newInstance();
		} catch (InstantiationException e1) {

			e1.printStackTrace();
			return retData;
		} catch (IllegalAccessException e1) {

			e1.printStackTrace();
			return retData;
		}

		Field[] fields = cls.getDeclaredFields();

		for (Field f : fields) {

			f.setAccessible(true);
			Class> tmpCls = f.getType();
			Log.d("tmpCls", tmpCls.getName());
			try {

				if (tmpCls.isAssignableFrom(List.class)) {

					JSONArray array = jsonObject.getJSONArray(f.getName());
					int size = array.length();

					JSONObject obj = array.optJSONObject(0);

					List list = new ArrayList();

					if (obj == null) {

						for (int i = 0; i < size; ++i) {
							list.add(array.opt(i));
						}
					} else {

						Type type = f.getGenericType();

						Class> paramClass = null;
						if (type instanceof ParameterizedType) {
							paramClass = (Class>) ((ParameterizedType) type).getActualTypeArguments()[0];
							for (int i = 0; i < size; ++i) {

								list.add(json2Object(array.optJSONObject(i), paramClass));
							}
						}

					}
					f.set(retData, list);

				} else if (isSelfDefineClass(tmpCls) || tmpCls.isMemberClass() || tmpCls.isLocalClass()) {

					f.set(retData, json2Object(jsonObject.getJSONObject(f.getName()), f.getType()));
				} else {

					f.set(retData, jsonObject.get(f.getName()));
				}

			} catch (IllegalArgumentException e) {

				e.printStackTrace();
			} catch (IllegalAccessException e) {

				e.printStackTrace();
			} catch (JSONException e) {

				e.printStackTrace();
			}
		}
		return retData;
	}

	final private static  boolean isSelfDefineClass(Class> cls) {

		return Object.class.isAssignableFrom(cls)
				&& !cls.getName().matches("(java.lang.[a-zA-Z]*)|(java.util.[a-zA-Z]*)");
	}

	@SuppressWarnings("unchecked")
	final public static JSONObject object2Json(Object object) {
		
		if (object == null){
			throw new NullPointerException("json2Object(JSONObject jsonObject), jsonObject is null");
		}

		JSONObject retObj = null;

		JSONStringer strJson = new JSONStringer();

		try {
			strJson.object();

			Field[] fields = object.getClass().getDeclaredFields();

			for (Field f : fields) {
				f.setAccessible(true);
				Class> cls = f.getType();
				try {
					if (isSelfDefineClass(cls) || cls.isMemberClass() || cls.isLocalClass()) {

						strJson.key(f.getName()).value(object2Json(f.get(object)));

					} else if (cls.isAssignableFrom(List.class)) {

						strJson.key(f.getName()).array();

						List list = (List) f.get(object);
						int size = list.size();

						Type type = f.getGenericType();
						Class> tmpCls = null;

						if (type instanceof ParameterizedType) {
							tmpCls = (Class>) ((ParameterizedType) type).getActualTypeArguments()[0];
						}

						if (isSelfDefineClass(tmpCls)) {
							for (int i = 0; i < size; ++i) {
								strJson.value(object2Json(list.get(i)));
							}
						} else {
							for (int i = 0; i < size; ++i) {
								strJson.value(list.get(i));
							}
						}
						strJson.endArray();
					} else {

						strJson.key(f.getName()).value(f.get(object));
					}
				} catch (JSONException e) {
					e.printStackTrace();
				} catch (IllegalArgumentException e) {
					e.printStackTrace();
				} catch (IllegalAccessException e) {
					e.printStackTrace();
				}
			}
			
			strJson.endObject();
			
			retObj = new JSONObject(strJson.toString());

		} catch (JSONException e1) {
			e1.printStackTrace();

			return retObj;
		}
		return retObj;
	}
}