Laravel控制器解析请求JSON数组访问Project属性报错如何解决
解决方案
问题根源
- 你提供的JSON存在语法错误:每个对象末尾的
email字段后多了多余逗号,数组最后一个元素末尾也多了逗号,导致json_decode解析失败返回null,访问null的Project属性就会触发非对象属性读取错误 - 你写的验证规则与请求参数结构不匹配:验证规则默认校验请求根节点的字段,但你的字段都嵌套在
Project数组内,所以会一直提示字段必填 - Laravel已内置JSON请求解析能力,不需要手动读取
$request->getContent()再解码,只要请求头携带正确的Content-Type: application/json即可直接通过请求实例取值
修复步骤
1. 修正JSON语法
删除所有多余逗号,正确JSON如下:
{"Project": [ { "name": "Project1", "category": "Web", "total_maintenance": "0", "maintenance_start": "2021-11-01", "maintenance_end": "2021-11-10", "email": "test12323@test.com" }, { "name": "Project1", "category": "Mobile", "total_maintenance": "0", "maintenance_start": "2021-11-01", "maintenance_end": "2021-11-10", "email": "test12323@test.com" } ]}
2. 调整Postman请求配置
POST请求的Body选择raw,格式切换为JSON,系统会自动为请求加上Content-Type: application/json请求头,将修正后的JSON填入请求体即可。
3. 修正Laravel代码
public function store(Request $request) { // 适配嵌套数组的验证规则 $validated = $request->validate([ 'Project' => 'required|array', 'Project.*.name' => 'required', 'Project.*.category' => 'required', 'Project.*.total_maintenance' => 'required', 'Project.*.maintenance_start' => 'required|date', 'Project.*.maintenance_end' => 'required|date', 'Project.*.email'=> 'required|email', ]); // 直接读取对应字段,不需要手动解码 $firstProjectName = $request->input('Project.0.name'); // 如果习惯对象写法,可以用以下方式 $allProjects = $request->collect('Project')->toBase(); $firstProjectName = $allProjects[0]->name; Log::info($firstProjectName); // 后续业务逻辑 }
如果你确实需要手动解码,可以加判断避免报错:
$decoded = json_decode($request->getContent()); if (json_last_error() === JSON_ERROR_NONE && isset($decoded->Project)) { Log::info($decoded->Project[0]->name); }
内容的提问来源于stack exchange,提问作者ander99
相关产品推荐
相关产品推荐

