閒來無事分析一下Android在開發中,後臺傳來的數據需要回傳給後臺時,爲什麼需要明確key?
項目中使用的是Gson框架。
先來看看Person是怎麼寫的,常規寫法,沒毛病
public class Person implements Serializable {
private String name;
private Param param;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public class Param implements Serializable {
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
}
再看一下請求,沒異議
//界面數據-請求A接口
HttpRequestPresenter.getInstance().post(getActivity(), true, url_a, null, new IRequestCallBack() {
@Override
public void success(String data, String msg) {
//json{ "name":"fly","param": {"id":1}}
Gson gson = new Gson();
mPerson = gson.fromJson(data, Person.class);
}
@Override
public void failed(int errorCode, String msg, String data, String code) {
}
});
//把param中的數據回傳-請求B接口
HashMap map = new HashMap();
map.put("id", String.valueOf(mPerson.param.id));
HttpRequestPresenter.getInstance().post(getActivity(), true, url_b, map, new IRequestCallBack() {
@Override
public void success(String data, String msg) {
}
@Override
public void failed(int errorCode, String msg, String data, String code) {
}
});
param在項目中協定爲請求某接口所需參數,其中的內容參數無需知道,只需請求接口時,原封不動的再傳給後臺。
那麼問題來了,如果在param中參數不固定的時候怎麼辦呢?
假如需求突然變了,請求B接口需要加一個參數comment,後臺在A接口返回的param中新加了參數comment,此時此刻以上的代碼就不對了。
這種情況爲什麼不能做成動態的呢?爲什麼不摒棄Gson的快捷應用,非得找後臺加參數時要提前聲明?
以下爲我嘗試解決這種情況的一種方法
前提我們已經協定了param是動態互傳的,可以直接把param的類型改成HashMap。
public class Person implements Serializable {
private String name;
private HashMap<String, String> param;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void setParam(HashMap<String, String> param) {
this.param = param;
}
public HashMap<String, String> getParam() {
return param;
}
}
//界面數據-請求A接口
HttpRequestPresenter.getInstance().post(getActivity(), true, url_a, null, new IRequestCallBack() {
@Override
public void success(String data, String msg) {
//json{ "name":"fly","param": {"id":1,"comment":"test"}}
Gson gson = new Gson();
mPerson = gson.fromJson(data, Person.class);
}
@Override
public void failed(int errorCode, String msg, String data, String code) {
}
});
//把param中的數據回傳-請求B接口
HashMap map = mPerson.getParam();
HttpRequestPresenter.getInstance().post(getActivity(), true, url_b, map, new IRequestCallBack() {
@Override
public void success(String data, String msg) {
}
@Override
public void failed(int errorCode, String msg, String data, String code) {
}
});
就算其他地方需要使用param中的某個參數,也可以get到,不是非得使用對象點變量吧
HashMap map = mPerson.getParam();
String comment = map.get("comment").toString();
這麼做有什麼不好嗎?
還遇到過一種情況
record中key是不固定的,value是固定結構。那我們可以把value的固定結構寫出來,用的時候可以非常便捷。
{
"name":"fly",
"param": {"id":1},
"record":{
"20190801":{"type":"a"},
"20190802":{"type":"b"},
"20190803":{"type":"c"}
}
}
public class Person implements Serializable {
private String name;
private Param param;
private HashMap<String, Record> record;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public class Param implements Serializable {
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
public class Record implements Serializable {
private String type;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
}
HttpRequestPresenter.getInstance().post(getActivity(), true, url_a, null, new IRequestCallBack() {
@Override
public void success(String data, String msg) {
Gson gson = new Gson();
Person mPerson = gson.fromJson(data, Person.class);
Map<String, Record> record = mPerson.getRecord();
//一、遍歷取出key
for (String key:record.keySet()){
Record value = record.get(key);
String type = value.getType().toString();
}
//二、遍歷取出鍵值對
for (Map.Entry<String,Record> pair:record.entrySet()){
String key = pair.getKey();
Record value = pair.getValue();
String type = value.getType().toString();
}
}
@Override
public void failed(int errorCode, String msg, String data, String code) {
}
});