編輯:關於Android編程
利用遞歸的方式反射解析到bean裡面
例如服務器指定規定json格式為:
{ "code": "……" , // 返回代號,預留字段,默認返回null "type":"ERROR", // 返回類型,表示操作是成功或失敗 "desc":"……", // 返回描述,描述性文字,主要保存用於彈窗顯示的文字 "action":"SHOW", //返回操作,該操作值提供給終端使用,用於決定當前收到返回後的操作 "data": "……" // 返回數據,根據請求上傳的參數,返回對應的數據,或返回null }
對應的數據在data裡面,data裡面的key對應一個bean,例如一個列表數據:
{ "desc":"查詢成功", "data":{ "diseaseList":[ { "xmlName":"精神病評估", "xmlId":"1066", "category":"symptom" }, { "xmlName":"對學習困難和認知延遲的評估", "xmlId":"884", "category":"symptom" }, { "xmlName":"疲乏的評估", "xmlId":"571", "category":"symptom" }, { "xmlName":"癡呆的評估", "xmlId":"242", "category":"symptom" }, { "xmlName":"非故意性體重減輕評估", "xmlId":"548", "category":"symptom" } ] }, "action":null, "code":"", "type":"SUCCESS" }
上面的list的bean定義為DiseaseList.java
public class DiseaseList { /** * xmlName : 分裂情感性障礙 * xmlId : 1199 * category : disease */ private String xmlName; //症狀名字 private String xmlId; //症狀名字 private String category; //分類的 英文名 private String letter = ""; //字母,轉為拼音後在這裡添加 public String getXmlName() { return xmlName; } public void setXmlName(String xmlName) { this.xmlName = xmlName; } public String getXmlId() { return xmlId; } public void setXmlId(String xmlId) { this.xmlId = xmlId; } public String getCategory() { return category; } public void setCategory(String category) { this.category = category; } public String getLetter() { return letter; } public void setLetter(String letter) { this.letter = letter; } }
Response.java:
/** * json返回的首key的內容類 * */ public class Response { //下面四個是固定寫在第一層的 private String code; private String type; private String desc; private String action; //Object 可以存放list private HashMapdatas = new HashMap (); //存放對象(一般是list),根據String這個id來取 //存放data裡面的基本類型 private HashMap dataValue = new HashMap<>(); public Response() { code = type = desc = action /*= version = token = applyAuthenticateId*/ = ""; } public final static String TOKEN = "token"; public final static String VERSION = "version"; public final static String PORTRAIT = "portrait"; public final static String USERID = "userId"; public final static String APPLYAUTHENTICATEID = "applyAuthenticateId"; public final static String ISDOCTOR = "isDoctor"; public final static String ISEXPERT = "isExpert"; public final static String WAY = "way"; public final static String DOWNLOAD = "download"; /** * 存值到hashmap裡面 * @param key * @param value */ public void put(String key, Object value) { datas.put(key, value); } /** * 獲取key對應的對象 * @param key key * @param 返回的對象 * @return hashMap的key對應的值 */ public T get(String key){ if(datas.containsKey(key)){ return (T)datas.get(key); } return null; } /** * 反射執行,添加到hashMap,data裡面的基本類型數據 * @param key * @param value */ public void addDataValue(String key, Object value){ dataValue.put(key,value); } /** * 獲取data裡面的基本類型數據 * @param key * @param * @return */ public T getDataValue(String key){ if(dataValue.containsKey(key)){ return (T)dataValue.get(key); } return null; } public String getCode() { return code; } public void setCode(String code) { if(null != code && !"".equals(code.trim())) this.code = code; } public String getDesc() { return desc; } public void setDesc(String desc) { if(!TextUtils.isEmpty(desc)) this.desc = desc; } }
json解析時候根據key在這裡獲取到對應的類實例
DATA.java:
/** * json解析的時候的類 */ public enum DATA { //疾病列表 DISEASELIST("diseaseList",DiseaseList.class) ; private final String mId; private final Class cls; public Class getClzss() { return cls; } DATA(String id, Class clzss) { mId = id; cls = clzss; } /** * 根據json的key獲取類 * @param id * @return */ public static DATA fromId(String id) { DATA[] values = values(); int cc = values.length; for (int i = 0; i < cc; i++) { if (values[i].mId.equals(id)) { return values[i]; } } return null; } @Override public String toString() { return mId; } }
對應的注釋已經寫到代碼裡面了
JsonResolveUtils.java
/** * json解析工具類 */ public class JsonResolveUtils { private static final String SET = "set"; private static final String PUT = "put"; /** * 開始解析json 字符串,解析為Response類bean形式 * * @param response json字符串 * @param cls Response類class * @param泛型,這裡傳遞了Response * @return */ public static T parseJsonToResponse(String response, Class cls) { if (null != response) { try { // 構建JSONObject 實例 JSONObject json = new JSONObject(response); // JSONObject 解析成具體Bean實例 T entity = toResponse(json, cls); return entity; } catch (JSONException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } return null; } /** * JSONObject解析成Response Bean實例 * * @param json json對象 * @param cls 轉換的對象,這裡是Response * @param 轉換的對象,這裡是Response * @return 返回Response對象 * @throws IllegalAccessException * @throws InstantiationException */ public static T toResponse(JSONObject json, Class cls) throws IllegalAccessException, InstantiationException { //聲明一個Response實例 T instance = null; if (null != json) { // 獲取根key Iterator iterator = json.keys(); //構建個實例Response Bean instance = cls.newInstance(); //開始遍歷根 key while (iterator.hasNext()) { try { String key = iterator.next(); //獲取key Object value = json.get(key); //獲取key對應的值 //值不為空 if (null != value) { if (!key.equals("data")) { //不是data數據,直接為Response的Bean屬性賦值 setter(instance, key, value); } else { // 解析data數據 if (value instanceof JSONObject) { //data 數據是JSONObject 開始解析json對象數據 parseJsonBean((JSONObject) value, instance); } else if (value instanceof JSONArray) { //data 數據是JSONArray 開始解析json數組數據 toBeanArray((JSONArray) value, instance); } else { //若都不是,直接為ResponseBean屬性賦值 setter(instance, key, value); } } } } catch (Exception e) { e.printStackTrace(); } } // while(~) } return instance; } /** * 解析單個JSON數據 * * @param json json * @param instance Bean實例 * @param */ public static void parseJsonBean(JSONObject json, T instance) { //json不為空 if (null != json) { //獲取json的key iterator Iterator iterator = json.keys(); while (iterator.hasNext()) { //獲取鍵值對 String key = iterator.next(); Object value = null; try { //獲取值 value = json.get(key); //value不為空 if (null != value) { // value 為json對象 則把json解析成具體的實例Bean if (value instanceof JSONObject) { // 獲取對應的實例Bean Class DATA clzss = DATA.fromId(key); //不為空 if (null != clzss) { //把json解析成該實例Bean Object entity = toBean((JSONObject) value, clzss.getClzss()); //把當前Bean類緩存在上級Bean屬性裡 putter(instance, entity.getClass(), key, entity); } } else if (value instanceof JSONArray) { //value 為json 數據對象,則把jsonarray解析成ArrayList // 獲取對應的實例Bean Class DATA clzss = DATA.fromId(key); if (null != clzss) { //把json解析成ArrayList Object entity = parseBeanArray((JSONArray) value, clzss.getClzss()); //把當前ArrayList 緩存在上級Bean屬性裡 putter(instance, entity.getClass(), key, entity); } } else { //都是不是,直接為上級Bean屬性賦值 if (instance instanceof Response) { //dada下面的標准類型的值設置進Respone的dataString setDataString(instance,key, value.toString()); } else { putter(instance, value.getClass(), key, value); } } } } catch (Exception e) { e.printStackTrace(); } } } } /** * 設置Response的dataString * * @param obj * @param key * @param value * @param */ private static void setDataString(Object obj, String key, String value) { //值不為空 if (null == value) return; try { //獲取addDataString方法,參數1 為方法名,2為類型 Method method = obj.getClass().getMethod("addDataValue", String.class, Object.class); //調用set方法賦值 method.invoke(obj, key, value); } catch (Exception e) { e.printStackTrace(); } } /** * 解析JSON成具體實例Bean * * @param json json數據 * @param cls 要解析成為的實例 * @param 返回實例 * @return * @throws IllegalAccessException * @throws InstantiationException */ public static T toBean(JSONObject json, Class cls) throws IllegalAccessException, InstantiationException { //聲明實例引用 T instance = null; //json不為空 if (null != json) { //獲取json key 的迭代器; Iterator iterator = json.keys(); //構建實例Bean instance = cls.newInstance(); //遍歷json key while (iterator.hasNext()) { //獲取鍵值對 String key = iterator.next(); Object value = null; try { value = json.get(key); //value不為空 if (null != value) { // value 為json對象 則把json解析成具體的實例Bean if (value instanceof JSONObject) { // 獲取對應的實例Bean Class DATA clzss = DATA.fromId(key); if (null != clzss) { //把json解析成該實例Bean Object entity = toBean((JSONObject) value, clzss.getClzss()); //把當前Bean類緩存在上級Bean屬性裡 putter(instance, entity.getClass(), key, entity); } } else if (value instanceof JSONArray) { //value 為json數組對象,則把jsonarray解析成ArrayList // 獲取對應的實例Bean Class DATA clzss = DATA.fromId(key); if (null != clzss) { //把json解析成ArrayList Object entity = parseBeanArray((JSONArray) value, clzss.getClzss()); //把當前ArrayList 緩存在上級Bean屬性裡 putter(instance, entity.getClass(), key, entity); } } else { //都是不是,直接為上級Bean屬性賦值 setter(instance, key, value); } } } catch (Exception e) { e.printStackTrace(); } } } return instance; } /** * 解析json裡面的json數組,例如專家列表 * * @param jsonarr * @param cls * @param * @return */ public static ArrayList
例如第一個數據獲取到list數據
//解析為response Response response = JsonResolveUtils.parseJsonToResponse(json,Response.class); 從response裡面獲取list數據 Listlist = new ArrayList<>(); //獲取完成開始解析為list bean Response response = JsonResolveUtils.parseJsonToResponse(json,Response.class); ArrayList cache = null; cache = response.get(DATA.DISEASELIST.toString()); if(cache != null && !cache.isEmpty()){ //添加到list list.addAll(cache); Log.e("tpnet",list.size()+"個數據"); }else{ //獲取數據失敗操作 }
解析的時候是根據返回的格式進行解析的,如果有數字類型的數據。在bean裡面應該寫完整幾種類型的數字,例如金額:
public class FinanceRecords { private String sum; //金額 public String getSum() { return sum; } //添加下面四種類型供json反射回調 public void setSum(String sum) { this.sum = sum; } public void setSum(Integer sum) { this.sum = sum+""; } public void setSum(Float sum) { this.sum = sum+""; } public void setSum(Double sum) { this.sum = sum+""; } }
下一篇文章有一個完整的demo。
起因寫博客就像講故事,得有起因,經過,結果,人物,地點和時間。今天就容我給大家講一個故事。人物呢,肯定是我了。故事則發生在最近的這兩天,地點在coder君上班的公司。那天
偶然中發現Android Studio的工程文件夾比ADT Bundle的大很多。用Android Studio新建一個空工程,工程文件夾大小為30M,運行一次後大小為4
Android安全加密專題文章索引 Android安全加密:對稱加密 Android安全加密:非對稱加密 Android安全加密:消息摘要Message D
AndroidApp上架所需文件上架准備App文件:1.安裝包2.應用商標:圖片格式PNG,大小512*512,小於800KB。3.應用截圖(4~6張):圖片格式JPG或