闲来无事分析一下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) {
}
});
另一种情况
{
"data":{
"1":"数字1",
"2":"数字2",
"3":"数字3"
}
}
HttpRequestPresenter.getInstance().post(getActivity(), true, url_a, null, new IRequestCallBack() {
@Override
public void success(String data, String msg) {
Gson gson = new Gson();
Map<String, Object> ps = gson.fromJson(data, new TypeToken<Map<String, Object>>(){}.getType());
for (Map.Entry<String,Object> pair:ps.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) {
}
});