編輯:關於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 HashMap datas = 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數據
List list = 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。
Android性能優化之被忽視的Memory Leaks
起因寫博客就像講故事,得有起因,經過,結果,人物,地點和時間。今天就容我給大家講一個故事。人物呢,肯定是我了。故事則發生在最近的這兩天,地點在coder君上班的公司。那天
為什麼 Android Studio 工程文件夾占用空間這麼大
偶然中發現Android Studio的工程文件夾比ADT Bundle的大很多。用Android Studio新建一個空工程,工程文件夾大小為30M,運行一次後大小為4
Android 安全加密:非對稱加密詳解
Android安全加密專題文章索引 Android安全加密:對稱加密 Android安全加密:非對稱加密 Android安全加密:消息摘要Message D
Android App發布到應用市場的流程
AndroidApp上架所需文件上架准備App文件:1.安裝包2.應用商標:圖片格式PNG,大小512*512,小於800KB。3.應用截圖(4~6張):圖片格式JPG或