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

使用OkHttp调用API时遭遇JSON转换异常,求解决方案

解决OkHttp响应转JSONObject的JSONException异常

问题根源

你遇到的JSONException核心原因是错误调用了ResponseBody的toString()方法——这个方法返回的是ResponseBody对象的内存标识字符串(比如报错里的okhttp3.internal.http.RealResponseBody@1e465c6),而非API返回的实际JSON内容,自然无法转换成JSONObject。

修复方案

将获取响应内容的代码从response.body!!.toString()改为response.body!!.string():

override fun onResponse(call: Call, response: Response) {
    // 替换toString()为string(),获取真正的响应JSON字符串
    val rawContact = response.body!!.string()

    val jsonObject = JSONObject(rawContact)

    val myTodo = Todo(
        jsonObject.getInt("userId"),
        jsonObject.getInt("id"),
        jsonObject.getString("title"),
        jsonObject.getBoolean("completed"))

    runOnUiThread {
        setValueForCheckBox(myTodo)
    }
}

额外优化建议

为了代码更健壮,建议补充以下处理:

  1. 先判断响应是否成功:
override fun onResponse(call: Call, response: Response) {
    if (!response.isSuccessful) {
        Log.e("API_ERROR", "请求失败,状态码:${response.code}")
        return
    }
    // 避免空指针,安全获取响应体
    val rawContact = response.body?.string() ?: run {
        Log.e("API_ERROR", "响应体为空")
        return
    }
    // 后续JSON解析逻辑
}
  1. 捕获JSON解析异常,避免崩溃:
try {
    val jsonObject = JSONObject(rawContact)
    val myTodo = Todo(
        jsonObject.getInt("userId"),
        jsonObject.getInt("id"),
        jsonObject.getString("title"),
        jsonObject.getBoolean("completed"))
    runOnUiThread {
        setValueForCheckBox(myTodo)
    }
} catch (e: JSONException) {
    Log.e("JSON_PARSE_ERROR", "解析失败:${e.message}")
}
  1. 注意string()方法只能调用一次,它会消耗响应体流,重复调用会抛出异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 08:56:08