最近客户端需求变更,服务器发送json格式的数据解析,但是我在做javaEE的时候,发现json是可以直接得到List ,class对象这些的,而在本身的android里面,省略了这些,所以这些需要自己来写,个人觉得,如果封装一个工具类就好了,如果使用反射机制就可以封装出来一个,但是实体类的字段就必须是public的!
下面是这个工具类的代码:
package com.zhangkeinfo.json.util;
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 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(); }
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(); } }
一个测试的实体类:
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; } } }
上面的代码,复制测试就可以了,本人也只是对反射机制了解一个基础,更深层次的还需要深入的研究的!
如果大家使用这个工具类有什么问题,可以随时联系我的 !QQ:84095015
<优化了上次存在的一个空对象问题>