如何用AJAX解析PHP返回的JSON?解析遇未终止字符串错误
解决JSON解析报错“Unterminated string”的问题
我看你遇到的情况挺典型——在线JSON解析器能正常识别数据,但前端用JSON.parse()就报字符串未终止的错误,咱们一步步排查解决:
1. 先搞定PHP端的编码和JSON输出规范
你返回的JSON里包含葡萄牙语特殊字符(比如Além里的é),这很可能是编码不兼容导致的问题:在线解析器会自动兼容编码,但JS的JSON.parse()对编码要求极严格,必须是UTF-8无BOM格式。
给你几个PHP端的修复步骤:
- 在PHP脚本最顶部(任何输出之前)设置响应头,明确编码:
header('Content-Type: application/json; charset=utf-8'); - 生成JSON时带上
JSON_UNESCAPED_UNICODE参数,避免特殊字符转义出错:echo json_encode($your_data_array, JSON_UNESCAPED_UNICODE); - 检查PHP文件本身的编码:确保是UTF-8(无BOM),有些编辑器默认会加BOM,这会让JSON开头多了看不见的字符,直接搞砸解析。
2. 排查AJAX返回的冗余内容
有时候PHP脚本会偷偷输出额外内容——比如错误提示、空格、换行,甚至是之前调试用的echo/var_dump,这些都会让JSON变得不完整。
你可以先在AJAX回调里打印原始返回内容,确认是不是纯JSON:
success: function (msg) { console.log("原始返回内容:", msg); // 先看返回的是不是干净的JSON try { let data = JSON.parse(msg); alert(data.username); } catch (e) { console.error("解析错误详情:", e); } }
如果发现有多余内容,去PHP脚本里检查:有没有开启错误输出?有没有多余的echo?有没有PHP闭合标签?>后面的空格?(建议PHP脚本最后不要加?>,避免意外输出)
3. 优化AJAX请求的写法
你当前的写法有点矛盾:把参数拼在URL里却用了POST方法,而且&是HTML实体,直接用在JS里会被当成字符串的一部分,导致参数传递错误,返回的JSON可能不是你预期的内容。
改成更规范的写法:
$.ajax({ url: EndSer + "includes/getPostInfo.php", type: "POST", data: { username: localStorage.getItem("usernameWI"), password: localStorage.getItem("passwordWI"), postCod: postCod }, dataType: "json", // 让jQuery自动解析JSON,不用手动JSON.parse() success: function (data) { alert(data.username); }, error: function(xhr, status, error) { console.error("请求错误:", status, error); console.log("错误返回内容:", xhr.responseText); }, cache: false });
这里加了dataType: "json",jQuery会自动处理JSON解析和编码问题,同时把POST参数放在data对象里,避免URL拼接的编码坑。
总结
大概率是编码不兼容或者PHP输出冗余内容导致的问题,先按上面的步骤排查:先搞定PHP的编码和JSON输出规范,再确认AJAX返回的内容是否纯净,最后调整AJAX写法即可。
内容的提问来源于stack exchange,提问作者André Morais
相关产品推荐
相关产品推荐

