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) {
     }
});

另一种情况

{
 "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) {
     }
});
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值