Android Kotlin报错:JSONArray无法转换为JSONObject求助
问题解决:JSONArray无法转换为JSONObject
问题原因
你使用JsonObjectRequest发起请求,但接口实际返回的是JSON数组([]格式),Volley会自动尝试把响应转换成JSONObject,因此触发类型转换错误。
解决方案
1. 替换请求类型
将JsonObjectRequest换成JsonArrayRequest,匹配接口返回的数组格式。
2. 调整响应处理逻辑
直接使用回调返回的JSONArray,无需手动转换,同时修正bookList的初始化位置(避免每次循环新建列表导致数据丢失)。
修改后的完整代码
findViewById<Button>(R.id.search1).setOnClickListener(){ val queue: RequestQueue = Volley.newRequestQueue(applicationContext) // 替换为JsonArrayRequest,适配接口返回的数组类型 val request = JsonArrayRequest(Request.Method.GET, url, null, { response -> Log.d("Json", ">>Response") try { // 将bookList初始化移到循环外,确保所有书籍存入同一个列表 val bookList = BookList() for (i in 0 until response.length()) { val dataObject = response.getJSONObject(i) bookList.add(Book( dataObject.getInt("book_id"), dataObject.getString("book_title"), dataObject.getString("author_name"), dataObject.getString("cover_uri") )) } println(bookList) } catch (e: Exception) { e.printStackTrace() } }, { error -> Log.e("TAG", "RESPONSE IS $error") Toast.makeText(this@MainActivity, "Fail to get response", Toast.LENGTH_SHORT).show() }) queue.add(request) }
关键改动点
- 替换请求类型:用
JsonArrayRequest替代JsonObjectRequest,直接接收接口返回的数组响应。 - 调整列表初始化位置:避免每次循环新建
bookList,保证所有数据存入同一个集合。 - 简化响应处理:回调参数
response已经是JSONArray,无需再通过JSONArray(response)重复转换。
内容的提问来源于stack exchange,提问作者Spiky
相关产品推荐
相关产品推荐

