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

