Volley解析错误:无法将字符串br转为JSONObject问题求助
解决Volley解析错误:org.json.JSONException: value br of type java.lang.string cannot be converted to JSONObject
这个错误的核心原因是服务器返回的不是有效的JSON数据,而是包含HTML错误提示(比如<br>标签)的文本,导致Volley无法将其解析为JSONObject/JSONArray。我们一步步来排查和修复:
一、先修复PHP代码的语法错误(最关键问题)
你的PHP代码存在两处明显语法问题,导致服务器输出错误信息而非预期的JSON:
isset判断的语法错误
原代码里的if (isset($title = $_POST["Title"])写法错误,isset的参数不能是赋值语句,正确写法应该先判断参数是否存在,再赋值:if (isset($_POST["Title"])) { $title = $_POST["Title"];多余的闭合大括号
代码末尾多了一个冗余的},删掉它保证代码结构完整。额外优化:防范SQL注入风险
你当前的SQL语句直接拼接用户输入,存在安全隐患,建议改用预处理语句绑定参数:$query = $conn->prepare('SELECT isbn, title, authors, accession, publisher, pubyear, pages, rak, hr, vr, barcode FROM books where title like ?'); $likeTitle = "%{$title}%"; $query->bind_param("s", $likeTitle);
修复后的完整PHP代码参考:
<?php include "connection.php"; if (isset($_POST["Title"])) { $title = $_POST["Title"]; if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } // 预处理语句防范SQL注入 $query = $conn->prepare('SELECT isbn, title, authors, accession, publisher, pubyear, pages, rak, hr, vr, barcode FROM books where title like ?'); $likeTitle = "%{$title}%"; $query->bind_param("s", $likeTitle); $query->execute(); $query->bind_result($isbn, $title, $authors, $accession, $publisher, $pubyear, $pages, $rak, $hr, $vr, $barcode); $books = array(); $data = array(); // 遍历查询结果 while($query->fetch()){ $temp = array(); $temp['isbn'] = $isbn; $temp['title'] = $title; $temp['authors'] = $authors; $temp['accession'] = $accession; $temp['publisher'] = $publisher; $temp['pubyear'] = $pubyear; $temp['pages'] = $pages; $temp['rak'] = $rak; $temp['hr'] = $hr; $temp['vr'] = $vr; $temp['barcode'] = $barcode; array_push($data, $temp); } $books['status'] = true; $books['search'] = $data; // 设置响应头为JSON格式,帮助Volley识别 header('Content-Type: application/json'); echo json_encode($books); } ?>
二、修复Android代码中的逻辑错误
你的Android代码里有一个明显的逻辑失误:
// 错误:新建了一个空的JSONObject,完全没用到Volley返回的响应数据 JSONObject array = new JSONObject();
应该直接使用Volley回调中返回的response对象:
@Override public void onResponse(JSONObject response) { Log.i("Response", response.toString()); try { // 直接用返回的response,不要新建空对象 Log.i("test", " value : " + response.getString("status")); if (response.getString("status").equals("true")) { JSONArray jsonArray = response.getJSONArray("search"); Log.i("test", " value : " + jsonArray.toString()); // 后续遍历列表的逻辑保持不变...
三、验证服务器返回内容
修复完代码后,建议先用Postman或者浏览器模拟POST请求,查看服务器返回的内容是否是标准JSON格式,确认没有<br>或其他错误文本后,再运行Android应用。
比如模拟POST请求http://192.168.0.136/fyp/stitle.php,参数Title设为某个图书标题,应该得到类似这样的响应:
{"status":true,"search":[{"isbn":123456,"title":"Android开发实战",...}]}
内容的提问来源于stack exchange,提问作者Asad Mallick
相关产品推荐
相关产品推荐

