解决file_get_contents获取JSON转PHP对象数组返回空数组的问题
如何将包含
no[]的JSON请求转换为PHP对象数组? 我来帮你分析问题根源,再给出可行的解决方案:
首先,你的核心问题出在前端发送的JSON格式和后端预期不匹配。HTML里的name="no[]"是给传统表单提交(application/x-www-form-urlencoded)设计的——这种场景下PHP会自动把多个选中的checkbox值解析成数组存入$_POST['no']。但如果是发送JSON请求,no[]只是一个普通的键名,不会被自动解析为数组;如果前端没正确收集选中的checkbox值,后端拿到的自然就是空数组。
方案1:修正前端JSON格式(推荐)
先调整前端发送的JSON结构,把选中的checkbox值整理成数组,用no作为键名(去掉[])。举个JS示例:
// 收集所有选中的checkbox值 const selectedValues = Array.from(document.querySelectorAll('input[name="no[]"]:checked')) .map(input => input.value); // 发送JSON请求 fetch('你的PHP文件路径.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ no: selectedValues }) });
然后后端PHP就可以轻松处理,转成对象数组:
$requestBody = file_get_contents("php://input"); // 第二个参数设为false,解析为对象而非关联数组 $requestData = json_decode($requestBody); $objectArray = []; if ($requestData && isset($requestData->no)) { // 把每个值包装成stdClass对象,组成对象数组 foreach ($requestData->no as $value) { $obj = new stdClass(); $obj->value = $value; // 可根据业务需求定义对象属性 $objectArray[] = $obj; } } else { $objectArray = []; } // 输出结果 print_r($objectArray);
方案2:如果前端无法修改,后端适配键名
如果因为某些限制不能修改前端,那后端要针对no[]这个特殊键名处理,但前提是前端确实发送了该键对应的数组值(你可以先通过var_dump($requestBody)查看原始JSON内容,确认键和值是否正确):
$requestBody = file_get_contents("php://input"); $requestData = json_decode($requestBody); $objectArray = []; // 对象属性名带特殊字符时,要用花括号包裹访问 if ($requestData && isset($requestData->{'no[]'})) { foreach ($requestData->{'no[]'} as $value) { $obj = new stdClass(); $obj->value = $value; $objectArray[] = $obj; } } else { $objectArray = []; } print_r($objectArray);
额外提示
如果你的场景其实是传统表单提交(不是JSON请求),那完全不需要用file_get_contents("php://input"),直接用$_POST['no']就能拿到选中的checkbox数组,再转成对象数组即可:
$objectArray = []; if (isset($_POST['no']) && is_array($_POST['no'])) { foreach ($_POST['no'] as $value) { $obj = new stdClass(); $obj->value = $value; $objectArray[] = $obj; } } print_r($objectArray);
内容的提问来源于stack exchange,提问作者Andy Hui




