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

PHP接口返回JSON遇Unexpected '}'错误求助(附代码)

解决JSON输出"Unexpected '}'"错误的方案

你的问题核心在于手动拼接JSON字符串,这种方式很容易因为转义处理不当、格式拼接失误引发语法错误,同时代码里还有一些细节问题会加重这个问题。下面一步步帮你修复:

1. 替换手动JSON拼接为整体编码

你当前是把json_encode($records)的结果硬拼到JSON字符串里,这种操作非常容易破坏JSON结构——比如如果records里的字段包含特殊字符,或者之前的addslashes导致双重转义,都会让最终的JSON出现语法错误。

正确的做法是把所有响应数据放进一个数组,交给json_encode一次性处理:

// 替换原来的手动拼接echo语句
$response = [
    'status' => '1',
    'message' => 'Jobs list found.',
    'jobslist' => $records
];
header('Content-Type: application/json');
echo json_encode($response);

其他分支的输出也统一改成这种方式:

// 无数据分支
$response = [
    'status' => '0',
    'message' => 'No Jobs found.'
];
header('Content-Type: application/json');
echo json_encode($response);

// 参数缺失分支
$response = [
    'status' => '0',
    'message' => 'Required Fields Missing.'
];
header('Content-Type: application/json');
echo json_encode($response);

这样能确保生成的JSON语法完全合规,不会再出现"Unexpected '}'"这类解析错误。

2. 移除不必要的addslashes

你在处理job_title、skills_prefered等字段时用了addslashes,但json_encode会自动处理字符串的转义逻辑,addslashes会导致双重转义——比如原本的双引号会被转义成\",经过json_encode后又变成\\",多余的反斜杠会让JSON解析器困惑。直接去掉addslashes即可:

// 原代码:$rows['job_title'] = addslashes($row->job_title);
$rows['job_title'] = $row->job_title;

// 处理技能字段时也去掉addslashes
$skills = trim(strip_tags($row->skills_prefered)) . PHP_EOL;
$rows['job_skills'] = str_replace(' ', ' ', utf8_encode($skills));

3. 修复循环中的数组初始化问题

你的$rows = array();定义在while循环外面,虽然PHP数组是值传递,每次$records[] = $rows会复制当前数组,但为了避免意外的残留数据干扰,建议在每次循环开始时重新初始化:

while($row = mysqli_fetch_object($query)) {
    $rows = []; // 每次循环新建空数组,避免数据残留
    // 后续字段赋值逻辑...
}

4. 修复SQL注入风险(重要)

你的代码直接把变量拼进SQL语句,比如"select * from test_company where company_id=".$row->company,这存在严重的SQL注入漏洞,应该用预处理语句执行查询:

// 替换原有的公司信息查询
$stmt = mysqli_prepare($dbcon, "SELECT * FROM test_company WHERE company_id = ?");
mysqli_stmt_bind_param($stmt, "i", $row->company); // "i"表示参数是整数类型
mysqli_stmt_execute($stmt);
$sql1 = mysqli_stmt_get_result($stmt);
$row1 = mysqli_fetch_object($sql1);

所有涉及变量的SQL查询都应该改成这种方式,避免被恶意攻击。

5. 添加基础错误处理

你的代码没有处理数据库查询失败的情况,如果某个查询出错(比如表名错误、权限不足),后续的mysqli_fetch_object会返回null,进而导致JSON输出异常。可以添加简单的错误捕获:

$query= mysqli_query($dbcon,$sql);
if (!$query) {
    $response = [
        'status' => '0',
        'message' => '数据库查询失败: ' . mysqli_error($dbcon)
    ];
    header('Content-Type: application/json');
    echo json_encode($response);
    exit;
}

最终修复后的核心代码片段

<?php
$dbcon=mysqli_connect("localhost","root","","testing");
$username = $_REQUEST['username'];

if($username != '') {
    $sql= "select * from test j,testing_user u where j.employer_id=u.id order by `date_added` desc limit 10";
    $query= mysqli_query($dbcon,$sql);
    
    if(!$query) {
        $response = ['status'=>'0', 'message'=>'查询失败: '.mysqli_error($dbcon)];
        header('Content-Type: application/json');
        echo json_encode($response);
        exit;
    }

    $records = array();
    if(mysqli_num_rows($query) > 0) {
        while($row = mysqli_fetch_object($query)) {
            $rows = [];
            $rows['job_id'] = $row->job_id;
            $rows['job_title'] = $row->job_title;
            $rows['username'] = $row->username;
            $rows['userid'] = $row->id;
            $rows['email'] = $row->email;

            // 预处理查询公司信息
            $stmt = mysqli_prepare($dbcon, "SELECT * FROM test_company WHERE company_id = ?");
            mysqli_stmt_bind_param($stmt, "i", $row->company);
            mysqli_stmt_execute($stmt);
            $sql1 = mysqli_stmt_get_result($stmt);
            $row1 = mysqli_fetch_object($sql1);
            $rows['companyname'] = $row1->name;
            $rows['reccruitername'] = $row1->contact_name;

            $rows['duration'] = $row->duration;
            
            $skills = trim(strip_tags($row->skills_prefered)) . PHP_EOL;
            $rows['job_skills'] = str_replace('&nbsp;',' ',utf8_encode($skills));
            
            $description = trim(strip_tags($row->description)) . PHP_EOL;
            $rows['job_description'] = str_replace('&nbsp;',' ',utf8_encode($description));

            // 城市查询
            $stmt = mysqli_prepare($dbcon, "SELECT * FROM test_cities WHERE code = ?");
            mysqli_stmt_bind_param($stmt, "i", $row->city);
            mysqli_stmt_execute($stmt);
            $sql2 = mysqli_stmt_get_result($stmt);
            $crow = mysqli_fetch_object($sql2);

            // 州查询
            $stmt = mysqli_prepare($dbcon, "SELECT * FROM test_states WHERE code = ?");
            mysqli_stmt_bind_param($stmt, "s", $row->state);
            mysqli_stmt_execute($stmt);
            $sql3 = mysqli_stmt_get_result($stmt);
            $srow = mysqli_fetch_object($sql3);
            
            $rows['joblocation'] = $crow->name.','.$srow->name;

            // 分类查询
            $stmt = mysqli_prepare($dbcon, "SELECT name FROM test_business WHERE id = ?");
            mysqli_stmt_bind_param($stmt, "i", $row->category);
            mysqli_stmt_execute($stmt);
            $catsql = mysqli_stmt_get_result($stmt);
            $catrow = mysqli_fetch_object($catsql);
            
            $exp = unserialize($row->experience);
            $stmt = mysqli_prepare($dbcon, "SELECT exp_value FROM test_experience WHERE id = ?");
            mysqli_stmt_bind_param($stmt, "i", $exp['to']);
            mysqli_stmt_execute($stmt);
            $expsql = mysqli_stmt_get_result($stmt);
            $experience = mysqli_fetch_object($expsql);
            
            $rows['jobcategory'] = $catrow->name;
            $rows['experience'] = $experience->exp_value;
            $rows['zipcode'] = $row->zipcode;
            $rows['areacode'] = $row->areacode;

            if (preg_match('/[^A-Za-z0-9]+/', $row->job_type)) {
                $rows['job_type'] = $row->job_type;
            } else {
                $params = unserialize($row->job_type);
                $param = implode(",",(array)$params);
                $stmt = mysqli_prepare($dbcon, "SELECT job_type FROM test_type WHERE id IN ($param)");
                mysqli_stmt_execute($stmt);
                $typequery = mysqli_stmt_get_result($stmt);
                $types = mysqli_fetch_object($typequery);
                $rows['job_type'] = $types->job_type;
            }

            // 申请状态查询
            $stmt = mysqli_prepare($dbcon, "SELECT * FROM testapp_jobs WHERE job_id = ? AND jobseeker_id = ?");
            mysqli_stmt_bind_param($stmt, "ii", $row->job_id, $row->id);
            mysqli_stmt_execute($stmt);
            $applysql = mysqli_stmt_get_result($stmt);
            $applyrow = mysqli_fetch_object($applysql);
            
            $rows['job_status'] = !empty($applyrow) ? '1' : '0';

            $str = 'No of Vacancies: '.$row->num_jobs.PHP_EOL.'Hourly Pay:'.$row->hourly_pay.PHP_EOL.'Duration:'.$row->duration;
            $rows['job_extrainfo'] = utf8_encode($str);
            $rows['posted'] = $row->publish_on;

            $records[] = $rows;
        }

        $response = [
            'status' => '1',
            'message' => 'Jobs list found.',
            'jobslist' => $records
        ];
    } else {
        $response = [
            'status' => '0',
            'message' => 'No Jobs found.'
        ];
    }
} else {
    $response = [
        'status' => '0',
        'message' => 'Required Fields Missing.'
    ];
}

header('Content-Type: application/json');
echo json_encode($response);
?>

这样修改后,不仅能解决JSON解析错误的问题,还能提升代码的安全性和稳定性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:09:39