项目场景:
像一般的请求接口规范,请求回来的类型是相同的,但是有某些不规范,返回的类型,比如一个key为sum,返回如果值是有值就返回1或2或3这种int类型,如果没有值就返回""或者null,这种String类型才能解析的
问题描述:
请求返回结果
//有值的话
{
sun:32
}
//没有值
{
sum:""
}
//或者null
{
sum:null
}
原因分析:
如果使用Gson解析工厂的话是解析不出来的,那么我们就需要自己去手动解析,判断一下类型,但是手动的话,少数可以,多数的话太麻烦
解决方案:
在最开始如果使用Retrofit请求的话,retrofit是没有提供直接取出返回的json的,所以我们需要把 我们的请求返回的类型改成okhtttp的ResponseBody
@GET("xxxx/xxxx")
Observable<ResponseBody> findDataByOrgIdOrder (@QueryMap HashMap<String,String> hashMap , @Header("MenuCode") String string);
在请求的地方收到
//这里是拿到数据,然后放入方法
String string = requestBody.string();
//key值是你那个那个key 通过hashMap.get(Key); 就能得到
//此处的hashmap 就是你解析完成的数据,只不过Value值都是String,看你自己需要自己改
HashMap<String,String> hashmap = JsonUtil.jsonToMap(string, false);
比如想获取上方得sum
//就可以获取到里面的值
hashmap.get("sum");
如果想要遍历得话 ,就变成迭代器
//完成遍历
Iterator<String> keys =hashmap.keySet().iterator();
while (keys.hasNext()){
String key = keys.next();
hashmap.get(key);
这里我自己从网上借鉴和自己结合了一波,不管返回的是什么类型,最后都是返回的就是HashMap<String,String>类型的hashmap,最后方便使用,但是缺点就是最外层的话我还没有去掉,所以只能在你自己手动解析到里面,去使用。(我这里只涉及到String,int,double。如果想全部类型的话,就一个判断接着一个判断,全部放入,最后未知类型都可以解析出来)
public class JsonUtil {
private static JsonUtil Instance = null;
//单例模式
public static JsonUtil getInstance() {
if (Instance == null) {
Instance = new JsonUtil();
}
return Instance;
}
//todo 将json对象转换成Map
//jsonstr 是传过来需要解析的字符串 hashmap是接收的HashMap
// isShowLog(这个就是方便查看解析到哪里失败了就可以)是控制是否打印的boolean tue为打印 false为不打印
//目前能解析int和double还有String 如果需要自己可以在后面添加
public static HashMap jsonToMap(String jsonstr, boolean isShowLog) throws JSONException {
//todo 拿到json后丢进来转换成为object对象
JSONObject jsonObject = new JSONObject(jsonstr);
//todo 接受返回值对象,封装最后返回的Map对象
HashMap<Object, Object> result = new HashMap<>();
//todo 获取所有的KEY
Iterator<String> iterator = jsonObject.keys();
String key = null;
//todo 因为value可能是任何类型,所以用所有类型的超类object接收
Object value = null;
//todo 此时iterator为所有的key,hasNext()如果有值的话
while (iterator.hasNext()) {
//todo 拿到一个值
key = (String) iterator.next();
//todo 拿到key所对应的value是一个object类型
value = jsonObject.get(key);
if (value instanceof String) {
if (isShowLog) {
Log.e("key, jsonObject.optString", key + "——" + jsonObject.optString(key, ""));
}
result.put(key, jsonObject.optString(key, ""));
} else if (value instanceof Integer) {
if (isShowLog) {
Log.e("key, jsonObject.optInt", key + "——" + jsonObject.optInt(key, 0));
}
result.put(key, "" + jsonObject.optInt(key, 0));
} else if (value instanceof Double) {
if (isShowLog) {
Log.e("key, jsonObject.get", key + "——" + jsonObject.optDouble(key, 0));
}
result.put(key, "" + jsonObject.optDouble(key, 0));
} else {
if (isShowLog) {
Log.e("key, jsonObject.optString", key + "——" + jsonObject.get(key));
}
result.put(key, (String) value);
}
}
return result;
}
}