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

Kotlin使用Volley解析PHP接口JSON时类型不匹配错误如何解决?

问题解决方法

错误原因

服务端返回的是JSON数组格式(外层为[]包裹),但你在Kotlin端使用的JsonObjectRequest仅支持解析外层为{}的JSON对象,所以触发类型不匹配报错。你之前手动trim掉[]的操作会破坏JSON结构,自然会报非法JSON错误,不要进行此类手动修改JSON结构的操作。

解决方案

方案1:修改Kotlin端代码适配JSON数组返回(推荐,无需改动服务端逻辑)

将JsonObjectRequest替换为JsonArrayRequest即可,修改后的代码如下:

private fun retriveProperties() {
        val sharedPref = getSharedPreferences("#####", Context.MODE_PRIVATE)
        var username = sharedPref.getString("user", null)
        val password = sharedPref.getString("pas", null)
        val url = "https://www.#########.com/api/getproperties.php?user="+username+"&pass="+password
        // 替换请求类为JsonArrayRequest
        val request = JsonArrayRequest(Request.Method.GET, url, null, Response.Listener {
                response ->try {
            // 拿到的response本身就是JSONArray,无需再从JSON对象中提取
            for (i in 0 until response.length()) {
                val employee = response.getJSONObject(i)
                val firstName = employee.getString("FName")
                Toast.makeText(applicationContext, firstName, Toast.LENGTH_LONG).show()
            }
        } catch (e: JSONException) {
            e.printStackTrace()
        }
        }, Response.ErrorListener { error -> error.printStackTrace() })
        requestQueue?.add(request)
}

方案2:修改PHP端返回JSON对象格式

如果你要保留Kotlin端的JsonObjectRequest写法,可以调整PHP侧的返回结构,将查询数组包裹在JSON对象中:

// 原输出逻辑假设为:echo json_encode($mysql_result_arr);
// 调整为以下写法
echo json_encode([
    'list' => $mysql_result_arr
]);

此时Kotlin端仅需修改数组提取的代码即可:

val jsonArray = response.getJSONArray("list")

安全提示

请勿在GET请求的URL中明文传递账号密码,该方式存在严重的敏感信息泄露风险,后续建议改为POST请求加密传输敏感参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 11:30:04