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

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:

  1. isset判断的语法错误
    原代码里的if (isset($title = $_POST["Title"])写法错误,isset的参数不能是赋值语句,正确写法应该先判断参数是否存在,再赋值:

    if (isset($_POST["Title"])) {
        $title = $_POST["Title"];
    
  2. 多余的闭合大括号
    代码末尾多了一个冗余的},删掉它保证代码结构完整。

  3. 额外优化:防范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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:14:50