Android 使用Gson解析json不固定key(二)

閒來無事分析一下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) {
     }
});
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章