You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中如何将Retrofit响应转换为JSON对象?

嘿,我来帮你搞定这个问题!看你用的是Retrofit 1.x版本(从代码里的RestAdapter能看出来),没法处理BufferedReader里的响应、想转成JSON对象是吧?这事儿不难,我给你一步步说清楚:

解决Retrofit 1.x响应转JSON对象的问题

核心思路是先把响应的输入流转换成字符串,再用JSON解析库(比如Android自带的org.json)把字符串转成JSON对象,下面是修改后的完整代码示例,直接替换你Callback里的实现就行:

api.sendme(userEmail, rs, Team1, Team2, new retrofit.Callback<retrofit.client.Response>() {
    @Override
    public void success(retrofit.client.Response response, retrofit.client.Response response2) {
        try {
            // 第一步:把响应流转换成字符串
            BufferedReader reader = new BufferedReader(new InputStreamReader(response.getBody().in()));
            StringBuilder responseBuilder = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                responseBuilder.append(line);
            }
            String rawJsonString = responseBuilder.toString();

            // 第二步:将字符串转成JSON对象
            JSONObject jsonObject = new JSONObject(rawJsonString);

            // 现在就可以操作JSON对象了,比如获取指定字段
            String targetValue = jsonObject.getString("your_target_key");
            Log.d("RetrofitResult", "解析得到的值:" + targetValue);

        } catch (IOException e) {
            e.printStackTrace();
            Log.e("RetrofitError", "读取响应流失败");
        } catch (JSONException e) {
            e.printStackTrace();
            Log.e("RetrofitError", "JSON解析失败");
        }
    }

    @Override
    public void failure(RetrofitError error) {
        // 处理请求失败的情况
        Log.e("RetrofitError", "请求失败:" + error.getMessage());
    }
});

额外优化建议

  • 可以把流转字符串的逻辑抽成工具方法,避免重复代码:
public static String streamToString(InputStream inputStream) throws IOException {
    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
    StringBuilder sb = new StringBuilder();
    String line;
    while ((line = reader.readLine()) != null) {
        sb.append(line).append("\n");
    }
    reader.close();
    return sb.toString();
}
  • 其实Retrofit 1.x支持直接把响应解析成自定义Java实体类,比手动处理JSON更省心。比如你先定义一个和JSON结构对应的实体类,再把Callback的泛型改成这个类,Retrofit会自动用Gson帮你解析:
// 定义和JSON结构匹配的实体类
public class MyResponse {
    private String yourTargetKey;
    // 其他字段 + 对应的getter/setter方法
    public String getYourTargetKey() {
        return yourTargetKey;
    }
}

// 修改后的Callback
api.sendme(userEmail, rs, Team1, Team2, new retrofit.Callback<MyResponse>() {
    @Override
    public void success(MyResponse myResponse, retrofit.client.Response response) {
        // 直接调用实体类的getter获取数据
        String value = myResponse.getYourTargetKey();
    }

    @Override
    public void failure(RetrofitError error) {
        // 处理错误
    }
});

这样就不用手动处理流和JSON对象了,代码更简洁也不容易出错。

内容的提问来源于stack exchange,提问作者vips singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:58:44