向PHP提交JSON报错:解析JSON时遇意外符号<
解决JSON提交到PHP时的解析错误问题
咱先把这个错误的本质说透:"There was an error parsing JSON data Unexpected token < in JSON at position 0",核心是你的PHP脚本返回的不是合法的JSON内容,而是带HTML标签的输出(比如PHP的报错提示、意外的空格或者调试打印内容),JSON解析器一看到开头的<直接就懵了,所以抛出了这个错误。
下面一步步排查和解决:
1. 先排查PHP代码的基础问题
- 检查
create.php的开头:<?php标签前面绝对不能有任何字符(包括空格、换行、HTML注释),哪怕一个不起眼的空格,都会导致PHP提前输出内容,直接破坏JSON的纯格式。 - 检查代码里有没有
echo、print这类调试输出,或者有没有触发PHP的警告/错误(比如未定义变量、数据库连接失败),这些情况都会让PHP输出带HTML标签的错误信息,而不是你期望的JSON。
2. 正确处理JSON输入的PHP代码示例
你得用file_get_contents('php://input')来读取POST请求体里的JSON数据,不能用$_POST(因为$_POST只处理表单编码的数据)。下面是修正后的核心代码片段:
<?php // 必要的响应头,确保返回纯JSON格式 header("Access-Control-Allow-Origin: *"); header("Content-Type: application/json; charset=UTF-8"); header("Access-Control-Allow-Methods: POST"); header("Access-Control-Max-Age: 3600"); header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With"); // 读取请求体中的JSON数据 $json_raw = file_get_contents('php://input'); // 解析JSON为关联数组 $request_data = json_decode($json_raw, true); // 检查JSON解析是否成功 if(json_last_error() !== JSON_ERROR_NONE) { http_response_code(400); echo json_encode(["message" => "无效的JSON数据"]); exit; } // 验证必填字段 if(empty($request_data['name']) || empty($request_data['price']) || empty($request_data['category_id'])) { http_response_code(400); echo json_encode(["message" => "缺少必填字段"]); exit; } // 接下来处理MySQL插入逻辑(以PDO为例) try { $pdo = new PDO("mysql:host=你的数据库地址;dbname=你的数据库名", "用户名", "密码"); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $pdo->prepare("INSERT INTO 你的表名 (name, price, description, category_id) VALUES (:name, :price, :description, :category_id)"); $stmt->bindParam(':name', $request_data['name']); $stmt->bindParam(':price', $request_data['price']); $stmt->bindParam(':description', $request_data['description']); $stmt->bindParam(':category_id', $request_data['category_id']); if($stmt->execute()) { http_response_code(201); echo json_encode(["message" => "记录创建成功"]); } else { http_response_code(500); echo json_encode(["message" => "创建记录失败"]); } } catch(PDOException $e) { http_response_code(500); // 注意:生产环境不要暴露具体错误信息,只返回通用提示 echo json_encode(["message" => "数据库错误:" . $e->getMessage()]); } ?>
3. ARC工具的测试注意事项
- 确保请求方法选择
POST - 请求头必须添加
Content-Type: application/json - 提交的JSON数据要放在请求体里,别当成表单参数提交
按照上面的步骤调整后,应该就能解决这个JSON解析错误了。
内容的提问来源于stack exchange,提问作者SicaYoumi




