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
相关产品推荐
相关产品推荐

