
AJAX 请求中 JSON.parse() 报错“unexpected character at line 1 column 1”,通常意味着服务器返回的并非合法 JSON(如 HTML 错误页、空白、PHP 警告或相对路径导致的 404 响应),而非 JavaScript 语法问题。本文聚焦真实场景中的典型诱因与可落地的调试策略。
ajax 请求中 `json.parse()` 报错“unexpected character at line 1 column 1”,通常意味着服务器返回的并非合法 json(如 html 错误页、空白、php 警告或相对路径导致的 404 响应),而非 javascript 语法问题。本文聚焦真实场景中的典型诱因与可落地的调试策略。
该错误表面是 JSON.parse(response) 失败,实则揭示了一个关键事实:前端接收到的 response 字符串根本不是 JSON 格式。错误提示 unexpected character at line 1 column 1(第 1 行第 1 列出现意外字符)几乎总是指向响应体以 , <code>W, P, N, ` `(空格)或空字符串开头——这些正是 HTML、PHP 错误警告、空白输出或 404 页面的典型特征。
? 根本原因分析:路径错误引发非 JSON 响应
在您提供的案例中,问题并非出在 jQuery 版本、dataType 设置或 PHP 逻辑本身,而是 AJAX 请求 URL 的路径解析失败:
// ❌ 错误写法(相对路径) url: "post-comment.php",
当页面 URL 为 https://rellawings.com/books/2/Superluminal/1/1.01-What-is-Love?/ 时,浏览器会将 "post-comment.php" 解析为:
https://rellawings.com/books/2/Superluminal/1/post-comment.php
而非预期的根目录下 https://rellawings.com/post-comment.php。由于该路径不存在,Web 服务器(如 Apache)可能返回 404 页面(HTML 格式),或触发 .htaccess 重写规则后返回意外内容(如首页 HTML)。此时 response 是一整页 HTML 文本,JSON.parse() 自然在第一个 字符处崩溃。
✅ 正确做法是使用绝对路径(以 / 开头)或完整 URL:
// ✅ 推荐:根相对路径(最简洁可靠) url: "/post-comment.php", // ✅ 或显式完整 URL(明确无歧义) url: "https://rellawings.com/post-comment.php",
?️ 必须执行的调试步骤(按顺序)
-
在
success回调中先打印原始响应
修改代码,务必在JSON.parse()前检查原始内容:success: function(response){ console.log("Raw response:", response); // ? 关键!查看实际返回内容 console.log("Response type:", typeof response, "Length:", response.length); // 再解析... try { var res = JSON.parse(response); // 后续逻辑 } catch (e) { console.error("JSON parse failed:", e, "Response was:", response); } } -
检查浏览器开发者工具 Network 面板
- 找到
post-comment.php请求 → 查看 Headers 标签页:确认Status是否为200 OK(非 404/500); - 查看 Response 标签页:直接查看服务器返回的原始文本——是否为
{"return":"1",...}?还是...或Warning: ...? - 查看 Preview 标签页:可视化渲染结果(若为 HTML 则立即暴露问题)。
- 找到
-
验证 PHP 端输出纯净性
当前 PHP 脚本存在两个高危风险点:-
未设置
Content-Type头:添加header('Content-Type: application/json; charset=utf-8');在echo json_encode(...)之前; -
潜在的输出前置:确保
post-comment.php文件开头无空格/BOM/<?php前的换行,且include的dbcon.php和functions.php也无任何输出(包括末尾的?>后换行)。推荐在 PHP 文件末尾省略?>以杜绝此类问题。
修正后的 PHP 关键部分:
<?php header('Content-Type: application/json; charset=utf-8'); // ? 强制 JSON 响应头 include "dbcon.php"; include "functions.php"; session_start(); // ... [原有逻辑] ... if(isset($_SESSION['uname'])){ // ... [插入逻辑] ... if ($conn->query($update) === TRUE) { $response = ['return'=>'1', 'contentrefresh'=>$contentrefresh]; } else { $response = ['return'=>'0', 'contentrefresh'=>$contentrefresh]; } echo json_encode($response); // ? 确保此处是唯一输出 exit; // ? 防止后续意外输出 } else { echo json_encode(['return'=>'0', 'contentrefresh'=>'']); exit; } -
未设置
✅ 最佳实践建议
-
永远优先使用
dataType: "json":jQuery 会自动调用JSON.parse()并在失败时触发error回调,比手动解析更健壮:jQuery.ajax({ method: "POST", url: "/post-comment.php", // 使用根路径 data: { /* ... */ }, dataType: "json", // ? 让 jQuery 处理解析 success: function(res) { // res 已是 JS 对象 if (res.return === "1") { $("#allcomments").html(res.contentrefresh); } }, error: function(xhr, status, err) { console.error("AJAX Error:", status, err); console.log("Response Text:", xhr.responseText); // 同样可查原始内容 } }); 服务端统一错误处理:对所有 PHP AJAX 入口,开头添加
error_reporting(0);(生产环境)或ini_set('display_errors', '0');,避免 PHP 警告污染 JSON 输出。-
前端防御性编程:即使设置了
dataType: "json",仍建议在success中校验关键字段:if (!res || typeof res !== 'object' || !('return' in res)) { console.warn("Invalid response structure"); return; }
通过定位路径错误这一核心诱因,并辅以标准化的调试流程与服务端输出净化,JSON.parse 的“意外字符”错误即可高效根除。记住:90% 的此类报错,根源都在服务器返回了非 JSON 内容——而路径错误是最隐蔽也最常见的元凶。


















