最近客户端需求变更,服务器发送json格式的数据解析,但是我在做javaEE的时候,发现json是可以直接得到List ,class对象这些的,而在本身的android里面,省略了这些,所以这些需要自己来写,个人觉得,如果封装一个工具类就好了,如果使用反射机制就可以封装出来一个,但是实体类的字段就必须是public的!
下面是这个工具类的代码:
- <p>package com.zhangkeinfo.json.util;</p><p>
- import java.lang.reflect.Field;
- import java.lang.reflect.Type;
- import java.util.ArrayList;
- import java.util.List;</p><p>import org.json.JSONArray;
- import org.json.JSONException;
- import org.json.JSONObject;</p><p>import android.util.Log;
- /**
- * json util class ,use in for analyzing json
- * @author spring sky
- * Email:vipa1888@163.com
- * QQ:840950105
- * 2011-12-14 15:39:51
- *
- */
- public class JsonUtil {
- private static final String TAG = "jsonUtil";
- private JSONObject jsonObject;
- private JsonUtil(String json)
- {
- Log.e(TAG, "json="+json);
- jsonObject = getJsonObject(json);
- if(jsonObject==null)
- {
- Log.e(TAG, "jsonobject is null");
- }
- }
- private JsonUtil() {
- super();
- }</p><p> public static JsonUtil newJsonUtil(String json)
- {
- JsonUtil util = new JsonUtil(json);
- return util;
- }
- /**
- * get json object
- * @param json json data
- * @return JOSNObject
- */
- public 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;
- }
- /**
- * get String data
- * @param json json data
- * @param key param
- * @return String data
- * @throws JSONException
- */
- public String getString(String key)
- {
- if(jsonObject!= null)
- {
- try {
- return jsonObject.getString(key);
- } catch (Exception e) {
- e.printStackTrace();
- return null;
- }
- }else{
- return null;
- }
- }
- /**
- * get String data
- * @param json json data
- * @param key param
- * @return int data
- * @throws JSONException
- */
- public int getInt(String key)
- {
- if(jsonObject!= null)
- {
- try {
- return jsonObject.getInt(key);
- } catch (Exception e) {
- e.printStackTrace();
- return -1;
- }
- }else{
- return -1;
- }
- }
- /**
- * get Double data
- * @param json json data
- * @param key param
- * @return double data
- * @throws JSONException
- */
- public double getDouble(String key)
- {
- if(jsonObject!= null)
- {
- try {
- return jsonObject.getDouble(key);
- } catch (Exception e) {
- e.printStackTrace();
- return -1;
- }
- }else{
- return -1;
- }
- }
- /**
- * This Method use in jsonObject get current class with object
- * @param jsonObject
- * @param c class
- * @return object
- * @throws Exception
- */
- public Object getObject(Class<?> c)
- {
- if(jsonObject!=null)
- {
- try {
- return getObject(c.getSimpleName().toLowerCase(),c);
- } catch (Exception e) {
- e.printStackTrace();
- return null;
- }
- }else{
- return null;
- }
- }
- /**
- * This Method use in jsonObject get current class with object
- * @param jsonObject
- * @param key query key
- * @param c class
- * @return object
- * @throws Exception
- */
- public Object getObject(String key,Class<?> c)
- {
- if(jsonObject!=null)
- {
- try {
- return getObject(jsonObject, key, c);
- } catch (Exception e) {
- e.printStackTrace();
- return null;
- }
- }else{
- return null;
- }
- }
- public Object getObject(JSONObject jsonObject,Class<?> c)
- {
- try {
- return getObject(jsonObject, c.getSimpleName().toLowerCase(), c);
- } catch (Exception e) {
- e.printStackTrace();
- return null;
- }
- }
- /**
- * This Method use in jsonObject get current class with object
- * @param jsonObject
- * @param key query key
- * @param c class
- * @return object
- * @throws InstantiationException
- * @throws IllegalAccessException
- * @throws Exception
- */
- public Object getObject(JSONObject jsonObject, String key,Class<?> c) throws IllegalAccessException, InstantiationException
- {
- Log.e(TAG,"key == " + key);
- Object bean =null ;
- if(jsonObject!=null)
- {
- JSONObject jo = null;
- if(key!=null)
- {
- try {
- jo = jsonObject.getJSONObject(key);
- } catch (JSONException e) {
- e.printStackTrace();
- jo = null;
- }
- }else{
- jo = jsonObject;
- }
- if(jo!=null)
- {
- if(c.equals(null))
- {
- Log.e(TAG, "class is null");
- try {
- bean = jo.get(key);
- } catch (JSONException e) {
- e.printStackTrace();
- bean = null;
- }
- }else{
- bean = c.newInstance();
- 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;
- try {
- value = jo.getString(f.getName());
- } catch (Exception e) {
- value =null;
- }
- Log.e(TAG,f.getName()+"="+value);
- if(type.equals(int.class))
- {
- f.setInt(bean,value==null?-1:Integer.valueOf(value));
- }else if(type.equals(double.class)){
- f.setDouble(bean,value==null?-1:Double.valueOf(value));
- }else if(type.getClass().equals(java.util.List.class)){
- Log.e(TAG, "this type is list");
- }else{
- f.set(bean,value);
- }
- }
- }
- }else{
- Log.e(TAG, "in jsonobject not key ");
- }
- }else{
- Log.e(TAG, "current param jsonobject is null");
- }
- return bean;
- }
- /**
- * This method use in jsonObject get list object
- * @param key list key
- * @param objectKey object key
- * @param c object
- * @return list
- * @throws Exception
- */
- public List<Object> getList(String key ,Class<?> c,int total)
- {
- List<Object> list = null;
- try {
- if(jsonObject!=null)
- {
- list = new ArrayList<Object>();
- if(total==1)
- {
- Object object = getObject(key, c);
- list.add(object);
- }else{
- JSONArray jsonArray = jsonObject.getJSONArray(key);
- if(!jsonArray.isNull(0))
- {
- for (int i = 0; i < jsonArray.length(); i++) {
- JSONObject jsObject = jsonArray.getJSONObject(i);
- Object object = getObject(jsObject, null, c);
- if(object!=null)
- {
- list.add(object);
- }
- }
- }
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- list=null;
- }
- return list;
- }
- /**
- * Test class field value
- * @param c
- * @param classObject
- * @throws IllegalArgumentException
- * @throws IllegalAccessException
- */
- public static String getFieldValue(Class<?> c,Object classObject) throws IllegalArgumentException, IllegalAccessException
- {
- StringBuffer sb = new StringBuffer();
- Field[] fs = c.getFields();
- for (int i = 0; i < fs.length; i++) {
- String s = fs[i].getName()+"="+fs[i].get(classObject);
- sb.append(s).append("\n");
- }
- // Log.e(TAG, sb.toString());
- return sb.toString();
- }
- }
- </p>
一个测试的实体类:
wallpaper :
- package com.zhangkeinfo.json.model.response;
- public class Wallpaper{
- public int id;
- public String name;
- public int rank;
- public String img;
- public String preview1url;
- public String preview2url;
- public String preview3url;
- public String msg;
- public int ptotal;
- }
Price:
- package com.zhangkeinfo.json.model.response;
- public class Price {
- public int id;
- public int price ;
- public String name;
- }
解析测试:
- package com.zhangkeinfo.json;
- import java.lang.reflect.Field;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import com.zhangkeinfo.json.model.request.ZmxURL;
- import com.zhangkeinfo.json.model.response.Price;
- import com.zhangkeinfo.json.model.response.Wallpaper;
- import com.zhangkeinfo.json.network.NetWorkUtil;
- import com.zhangkeinfo.json.util.JsonUtil;
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.TextView;
- public class MainActivity1 extends Activity implements OnClickListener{
- private static final String TAG = "MainActivity";
- Button button1,button2;
- TextView text;
- /**
- * 测试的json数据
- */
- public String json = "{\"id\":\"17\",\"res\":\"1\",\"wallpaper\":{\"id\":\"50\",\"name\":\"壁纸1\",\"rank\":\"0\",\"img\":\"img/a.png\",\"preview1url\":\"img/a.png\",\"preview2url\":\"img/a.png\",\"preview3url\":\"img/a.png\",\"msg\":\"\",\"ptotal\":\"1\"},\"price\":[{\"id\":\"1\",\"price\":\"1\",\"name\":\"点播\"},{\"id\":\"2\",\"price\":\"6\",\"name\":\"包月\"}]}";
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- button1 = (Button) this.findViewById(R.id.button1);
- button1.setOnClickListener(this);
- }
- @Override
- public void onClick(View v) {
- switch (v.getId()) {
- case R.id.button1:
- try {
- StringBuffer sb = new StringBuffer();
- /**
- * 得到实例对象
- */
- JsonUtil util1 = JsonUtil.newJsonUtil(json);
- /*
- * 得到list对象 第三个参数是这个list中一共有多少个对象 //ptotal就是获取订阅方式的个数
- */
- List<Object> list = util1.getList("prices", Price.class,util1.get("ptotal")); for(int i =0 ;i< list.size();i++)
- {
- Price price = (Price) list.get(i);
- sb.append(JsonUtil.getFieldValue(Price.class, price));
- }
- /**
- * 得到对象
- */
- Wallpaper wallpaper = (Wallpaper) util1.getObject( Wallpaper.class);
- if(wallpaper!=null)
- {
- /**
- * 反射得到字段的内容
- */
- Field[] fs = Wallpaper.class.getFields();
- for (int i = 0; i < fs.length; i++) {
- String s = fs[i].getName()+"="+fs[i].get(wallpaper);
- sb.append(s).append("\n");
- }
- }else{
- sb.append("wallpaper is null");
- }
- text.setText(sb.toString());
- } catch (Exception e) {
- e.printStackTrace();
- }
- break;
- }
- }
- }
上面的代码,复制测试就可以了,本人也只是对反射机制了解一个基础,更深层次的还需要深入的研究的!
(源自:http://blog.youkuaiyun.com/vipa1888/article/details/7071389)