PHP接口返回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(' ',' ',utf8_encode($skills)); $description = trim(strip_tags($row->description)) . PHP_EOL; $rows['job_description'] = str_replace(' ',' ',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

