Android Kotlin远程JSON解析崩溃问题求助
问题解决:JSON解析错误导致应用崩溃
核心问题
你的接口返回的是JSON数组(用[]包裹的多个对象),但代码里错误地先把响应转换成JSONObject,这直接触发了类型不匹配的崩溃,日志里的JSONArray cannot be converted to JSONObject已经明确指出了这点。
另外之前列表为空是因为Android默认禁止明文HTTP请求,添加android:usesCleartextTraffic="true"后请求能正常获取数据,但解析逻辑错误导致崩溃。
修正后的MainActivity关键代码
把解析部分的逻辑改成直接处理JSON数组,并且要在主线程通知Adapter更新数据:
client.newCall(request).enqueue(object : Callback { override fun onFailure(call: Call, e: IOException) { e.printStackTrace() // 在主线程提示用户请求失败 runOnUiThread { Toast.makeText(this@MainActivity, "请求失败", Toast.LENGTH_SHORT).show() } } override fun onResponse(call: Call, response: Response) { val strResponse = response.body?.string() ?: return try { // 直接把响应解析成JSONArray,而非JSONObject val episodeArray = JSONArray(strResponse) for (i in 0 until episodeArray.length()) { val episodeDetails = episodeArray.getJSONObject(i) list.add( ListItem( episodeDetails.getString("pub_date"), episodeDetails.getString("title"), episodeDetails.getString("description"), episodeDetails.getString("youtube_link") ) ) } // 必须在主线程更新RecyclerView的Adapter runOnUiThread { rcView.adapter?.notifyDataSetChanged() } } catch (e: JSONException) { e.printStackTrace() runOnUiThread { Toast.makeText(this@MainActivity, "数据解析失败", Toast.LENGTH_SHORT).show() } } } })
额外注意事项
- 主线程更新UI:OkHttp的回调运行在子线程,所有涉及UI或Adapter的操作必须通过
runOnUiThread切换到主线程,否则会触发异常。 - 空安全处理:用
response.body?.string() ?: return替代原代码的response.body!!.string(),避免空指针崩溃,这是Kotlin更安全的写法。 - 错误提示:添加Toast提示能让用户直观了解请求或解析的状态,提升应用体验。
内容的提问来源于stack exchange,提问作者Alexey Pavlov
相关产品推荐
相关产品推荐

