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
相关产品推荐
相关产品推荐

