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

Android中如何将Retrofit的ResponseBody转换为JSONObject

Retrofit响应体转JSONObject的正确处理方式

你遇到的问题核心是:直接调用response.body().toString()拿到的是ResponseBody对象的内存标识(比如okhttp3.ResponseBody$1@6015676),根本不是接口返回的JSON内容。要正确获取响应的JSON字符串,得用ResponseBody的string()方法,而非默认的toString()。

下面是修正后的完整代码:

retrofitCall.enqueue(object : Callback<ResponseBody?> {
    override fun onResponse(call: Call<ResponseBody?>, response: Response<ResponseBody?>) {
        if (response.isSuccessful && response.body() != null) {
            try {
                // 正确获取接口返回的JSON字符串
                val jsonString = response.body()!!.string()
                Log.e("response", "responseNew $jsonString")
                // 转换为JSONObject
                val responseBody = JSONObject(jsonString)
                
                // 示例:从JSONObject中读取数据
                val hasMultipleClients = responseBody.getBoolean("has_multiple_clients")
                val clients = responseBody.getJSONArray("clients")
                Log.e("parsed_result", "多客户端标识: $hasMultipleClients, 客户端列表: $clients")
            } catch (e: JSONException) {
                Log.e("parse_error", "JSON解析失败: ${e.message}")
            } catch (e: IOException) {
                Log.e("read_error", "读取响应体失败: ${e.message}")
            }
        } else {
            Log.e("request_error", "请求失败,响应码: ${response.code()}")
        }
    }

    override fun onFailure(call: Call<ResponseBody?>, t: Throwable) {
        Log.e("request_failed", "请求出错: ${t.message}")
    }
})

需要注意的细节:

  • 必须先判断response.isSuccessful和response.body() != null,避免空指针或无效响应
  • string()方法只能调用一次,因为ResponseBody的数据流会被一次性消耗,若需多次使用需先将字符串缓存
  • 必须捕获JSONException(解析失败)和IOException(流读取失败),避免崩溃

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 10:11:11