Android ,同一个参数解析可能类型不同

项目场景:

像一般的请求接口规范,请求回来的类型是相同的,但是有某些不规范,返回的类型,比如一个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;
    }

}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值