当前位置:   article > 正文

Android ,同一个参数解析可能类型不同_android 某个传参支持两种类型

android 某个传参支持两种类型

项目场景:

像一般的请求接口规范,请求回来的类型是相同的,但是有某些不规范,返回的类型,比如一个key为sum,返回如果值是有值就返回1或2或3这种int类型,如果没有值就返回""或者null,这种String类型才能解析的


问题描述:

请求返回结果

//有值的话
{
	sun:32
}

//没有值
{
	sum:""
}
//或者null
{
	sum:null
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

原因分析:

如果使用Gson解析工厂的话是解析不出来的,那么我们就需要自己去手动解析,判断一下类型,但是手动的话,少数可以,多数的话太麻烦


解决方案:

在最开始如果使用Retrofit请求的话,retrofit是没有提供直接取出返回的json的,所以我们需要把 我们的请求返回的类型改成okhtttp的ResponseBody

 @GET("xxxx/xxxx")
    Observable<ResponseBody> findDataByOrgIdOrder (@QueryMap HashMap<String,String> hashMap , @Header("MenuCode") String string);
  • 1
  • 2

在请求的地方收到

//这里是拿到数据,然后放入方法
String  string = requestBody.string();
//key值是你那个那个key    通过hashMap.get(Key);  就能得到
//此处的hashmap 就是你解析完成的数据,只不过Value值都是String,看你自己需要自己改
HashMap<String,String> hashmap =  JsonUtil.jsonToMap(string, false);
  • 1
  • 2
  • 3
  • 4
  • 5

比如想获取上方得sum

//就可以获取到里面的值
hashmap.get("sum");
  • 1
  • 2

如果想要遍历得话 ,就变成迭代器

//完成遍历
 Iterator<String> keys =hashmap.keySet().iterator();
                while (keys.hasNext()){
                    String key = keys.next();
                    hashmap.get(key);
  • 1
  • 2
  • 3
  • 4
  • 5

这里我自己从网上借鉴和自己结合了一波,不管返回的是什么类型,最后都是返回的就是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;
    }

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/210750
推荐阅读
相关标签
  

闽ICP备14008679号