使用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) } }
额外优化建议
为了代码更健壮,建议补充以下处理:
- 先判断响应是否成功:
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解析逻辑 }
- 捕获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}") }
- 注意
string()方法只能调用一次,它会消耗响应体流,重复调用会抛出异常。
内容的提问来源于stack exchange,提问作者xaso
相关产品推荐
相关产品推荐

