PHP如何解析异常POST请求中的JSON数据并提取独立键值对?
问题解析:POST JSON数据到PHP后的正确解析方式
我来帮你理清楚这个问题的根源和解决办法~
你的问题场景
你通过POST请求向function.php发送数据,用JSON.stringify({ username1: 'example1', username2: 'example2' })处理数据,但请求头设置成了{ 'Content-Type': 'application/x-www-form-urlencoded' }。尝试解析数据时遇到了奇怪的结果:
- 执行
$data = json_encode($_POST); echo $data;得到{"{"username1":"example1","username2":"example2"}": ""} - 用
$data["username1"]只返回{,$data->username1返回空值 var_dump($_POST)结果为array(1) { ["{"username1":"example1","username2":"example2"}"]=> string(0) "" }
问题出在哪?
核心原因是请求头和发送的数据格式不匹配:
- 你发送的是JSON格式的字符串,但请求头告诉PHP这是
application/x-www-form-urlencoded(表单编码格式)的数据 - PHP的
$_POST只会自动解析表单编码或multipart/form-data格式的数据,它无法识别你发送的JSON字符串,于是把整个JSON串当作了表单的一个键,对应的值为空——这就是你看到奇怪结果的原因
两种解决方案
方案1:修改前端请求头(推荐,符合HTTP规范)
既然发送的是JSON数据,就把请求头改成Content-Type: application/json,后端就能正确读取并解析了:
前端代码示例
fetch('function.php', { method: 'POST', headers: { 'Content-Type': 'application/json' // 改成JSON类型请求头 }, body: JSON.stringify({ username1: 'example1', username2: 'example2' }) })
后端PHP代码
// 读取原始的请求体内容 $rawJson = file_get_contents('php://input'); // 把JSON解析为关联数组(第二个参数true返回数组,否则是对象) $parsedData = json_decode($rawJson, true); // 现在可以正常获取每个键值对了 echo "username1: " . $parsedData['username1'] . "<br>"; echo "username2: " . $parsedData['username2'] . "<br>"; // 也可以遍历所有键值对输出 foreach ($parsedData as $key => $value) { echo "键:$key,值:$value<br>"; }
方案2:不修改前端,后端适配解析
如果没办法调整前端代码,那可以从$_POST里取出那个唯一的键(也就是完整的JSON字符串),再手动解析:
// 取出$_POST数组里的唯一键(就是你发送的JSON字符串) $jsonString = key($_POST); // 解析JSON为关联数组 $parsedData = json_decode($jsonString, true); // 后续使用和方案1一致 echo "username1: " . $parsedData['username1'] . "<br>"; echo "username2: " . $parsedData['username2'] . "<br>";
内容的提问来源于stack exchange,提问作者VanilJS
相关产品推荐
相关产品推荐

