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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 10:25:24