开发者社区> 问答> 正文

Retrofit2.0 Json解析成HashMap

1、比如,接口返回数据如下所示:

{
  "id": 11,
  "name": "电量仪E3",
  "A相功率因数": "0.0",
  "A相总功率": "0.0",
  "A相无功功率": "0.0",
  "A相视在功率": "0.0",
  "B相功率因数": "0.0",
  "B相总功率": "0.0",
  "B相无功功率": "0.0",
  "B相视在功率": "0.0",
  "C相功率因数": "0.0",
  "C相总功率": "0.0",
  "C相无功功率": "0.0",
  "C相视在功率": "0.0",
  "报错": "0.0",
  "A相电流": "0.0",
  "B相电流": "0.0",
  "C相电流": "0.0",
  "A相功率": "0.0",
  "B相功率": "0.0",
  "C相功率": "0.0",
  "A相电压": "0.0",
  "B相电压": "0.0",
  "C相电压": "0.0",
  "系统功率因数": "0.0",
  "系统无功功率": "0.0",
  "系统有功功率": "0.0",
  "系统视在功率": "0.0",
  "频率": "0.0",
  "系统总功率": "0.0",
  "AB线电压": "0.0",
  "AC线电压": "0.0",
  "BC线电压": "0.0",
  "负荷特性": "0.0"
}

2、按照json解析成Hash,而不是转化为pojo,目的是为了更好地显示数据,如下图:
screenshot
google过,按照别人的文章,我自己试了一下:

Call<Response> call = myService.getDeviceData(room_id, device_id);
        call.enqueue(new Callback<Response>() {
            @Override
            public void onResponse(Response<Response> response) {
                if (response.body().code() == 200) {
                    String jsonString = response.body().toString();
                    System.out.println(">>>>>>>>>");
                    System.out.println(jsonString);
                    System.out.println(">>>>>>>>>");
                } else {

                }
            }

            @Override
            public void onFailure(Throwable t) {
                System.out.println("设备数据获取失败");
                // TODO: 16/2/22 错误处理
            }
        });

但是运行时会报错:
'retrofit2.Response' is not a valid response body type. Did you mean ResponseBody?
总结:我需要展示json数据的key和value,如果有可行的解决方案,不转化成hashmap也行,,希望各位朋友们能指点迷津

展开
收起
蛮大人123 2016-03-11 11:07:30 2792 0
1 条回答
写回答
取消 提交回答
  • 我说我不帅他们就打我,还说我虚伪

    Retrofit 自带了转换的功能,可以将服务器返回的数据自动解析为你的Java Bean,所以这个地方你不能使用Response。
    你可以直接用 HashMap 代替 Response,即:

    Call<HashMap<String,String>> call = myService.getDeviceData(room_id, device_id);
    call.enqueue(new Callback<HashMap<String,String>>() {
        @Override
        public void onResponse(Call<HashMap<String,String>> call, Response<HashMap<String,String>> response) {
            HashMap<String,String> map = response.body();
            // TODO 显示 response.
        }
    
        @Override
        public void onFailure(Call<HashMap<String,String>> call, Throwable t) {
            System.out.println("设备数据获取失败");
            // TODO: 16/2/22 错误处理
        }
    });

    相应的,你的接口也要改返回值的范型,我这边用的是Retrofit 2.0,你的版本如果回调中没有Call<HashMap<String,String>> call 就忽略。
    同样的你还可以 把HashMap<String,String>换为JSONObject(实际上里面就是Map)

    2019-07-17 18:58:43
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
神龙云服务器产品及技术深度解析 立即下载
弹性创造价值:基于ECS的最佳性价比实践解析 立即下载
又快又稳:阿里云下一代虚拟交换机解析 立即下载

相关镜像