AJAX解析PHP API大JSON响应遇转义字符错误求助
解决方案:AJAX解析含印地语字符的大体积JSON失败
针对你遇到的「返回100条以上含印地语字符的记录时,JSON解析出现转义字符错误,且响应存在垃圾/空字符」的问题,按以下步骤排查解决:
1. 修正PHP端JSON输出的核心配置
(1)确保输出无冗余内容且字符编码正确
在PHP脚本开头添加缓冲清理和响应头设置,避免多余输出(如空格、BOM头)干扰JSON结构:
<?php ob_clean(); // 清空所有前置输出缓冲 header('Content-Type: application/json; charset=utf-8'); // 明确响应类型为UTF-8编码的JSON // 数据库查询逻辑... // 构造响应数组 $response = [ 'message' => 'Data retrieved successfully.', 'status' => '1', 'currentPage' => '1', 'totalPages' => '4', 'data' => $fetched_data ]; // 编码JSON时保留Unicode字符(避免印地语被转义为\uXXXX,减少转义错误概率) $json_output = json_encode($response, JSON_UNESCAPED_UNICODE); // 检查JSON编码是否出错 if (json_last_error() !== JSON_ERROR_NONE) { error_log('JSON编码错误: ' . json_last_error_msg()); echo json_encode(['status' => '0', 'message' => '数据编码失败']); exit; } echo $json_output; exit; // 强制终止脚本,避免后续冗余输出 ?>
(2)修复PostgreSQL字符集问题
确保PHP与PostgreSQL连接时使用UTF-8字符集,避免数据库返回的印地语字符编码混乱:
- 若使用PDO连接:
$pdo = new PDO("pgsql:host=localhost;dbname=your_db;charset=utf8", $user, $pass); - 若使用pg_connect:
$conn = pg_connect("host=localhost dbname=your_db user=$user password=$pass"); pg_query($conn, "SET NAMES 'UTF8';");
2. 优化AJAX调用,避免手动解析错误
直接让jQuery自动处理JSON解析,无需手动调用JSON.parse,同时指定响应类型:
$.ajax({ url: "api/getPrintReport.php", type: "POST", dataType: 'json', // 告诉jQuery预期接收JSON格式响应 data: { fromDateLimit: dateVal, toDateLimit: dateVal1, reportType: selectedReportIndex, cadreCode: cadreCode, pageNo: startPageNo }, success: function (json) { // 直接接收解析后的JSON对象 if (json.status === "1") { // 业务逻辑处理 } else { modalBox.modal('show'); modalBoxMessage.html(json.message); } }, error: function (jqXHR, textStatus, errorThrown) { modalBox.modal('show'); modalBoxMessage.html(errorThrown); } });
3. 排查输出缓冲与截断问题
错误提示出现在65529列(接近64KB),大概率是PHP输出缓冲配置导致的截断:
- 修改php.ini中的
output_buffering参数为Off,或设置更大的缓冲值(如655360即640KB) - 若无法修改php.ini,可在PHP脚本开头添加
ob_start();强制开启自定义缓冲,避免分段输出导致的字符损坏
4. 清理数据库中的不可见字符
若数据库字段包含控制字符(如空字符、换行符),会导致JSON解析失败,可在查询时清理:
SELECT regexp_replace(column_name, '[^[:print:]]', '', 'g') AS cleaned_column FROM your_table;
该SQL会移除字段中的所有非打印字符,避免污染JSON结构。
内容的提问来源于stack exchange,提问作者Vishal Vijayvergiya
相关产品推荐
相关产品推荐

