PHP获取含嵌套集合的请求体并正确解析问题求助
问题:JSON请求体嵌套数组解析异常,得到序列化字符串而非原JSON结构
场景复现
通过Postman发送的请求体:
{ "title": "foo", "colors": [{ "name": "green" }, { "name": "red" },{ "name": "pink" }] }
PHP后端(Symfony框架)获取请求体的代码:
use Symfony\Component\HttpFoundation\Request; public function test (Request $request) { $data = json_decode($request->getContent(), false); dd($data->title); // 正常输出"foo" // 但获取$data->colors时得到序列化字符串:a:1:{i:0;s:2:"green";i:1;s:2:"red";i:2;s:2:"pink";} // 期望得到JSON格式字符串:[{"name": "green"}, ... ] }
解决方案
1. 确认请求头设置正确
确保Postman的请求头中设置了Content-Type: application/json,这是Symfony自动解析JSON请求体的前提。如果未设置,Symfony会把请求体当作表单数据处理,嵌套数组会被自动序列化为字符串。
2. 使用Symfony Request内置方法解析(推荐)
Symfony的Request对象会根据请求头自动解析JSON数据,无需手动调用json_decode($request->getContent()),直接用以下方式获取正确结构:
use Symfony\Component\HttpFoundation\Request; public function test(Request $request) { // 方式1:获取解析后的关联数组,再转成JSON字符串 $data = $request->toArray(); $colorsJson = json_encode($data['colors']); dd($colorsJson); // 输出期望的[{"name":"green"},{"name":"red"},{"name":"pink"}] // 方式2:直接获取colors字段,再转JSON $colors = $request->get('colors'); $colorsJson = json_encode($colors); dd($colorsJson); }
3. 若必须手动解析请求体
如果因为特殊场景需要手动处理$request->getContent(),请先确保请求体是原始JSON字符串,再进行解析:
use Symfony\Component\HttpFoundation\Request; public function test(Request $request) { $content = $request->getContent(); // 先验证内容是否为有效JSON if (json_validate($content)) { $data = json_decode($content, true); // 转关联数组 $colorsJson = json_encode($data['colors']); dd($colorsJson); } }
内容的提问来源于stack exchange,提问作者Joker Bench
相关产品推荐
相关产品推荐

