如何阻止Laravel过滤请求JSON中的空数组?
解决Laravel移除请求JSON中空数组的问题
这个问题其实是Laravel默认的请求中间件在搞鬼!默认情况下,ConvertEmptyStringsToNull中间件会把请求中的空字符串转换为null,但对于空数组,在递归处理请求数据的过程中,它会被误处理导致最终无法正常获取。下面给你几个可行的解决方案:
方案1:直接获取原始JSON数据(最快临时解决)
如果你只是在个别控制器方法里需要保留空数组,可以直接从请求中获取原始的JSON字符串自行解析,绕过中间件的处理逻辑:
public function test(Request $request) { // 获取原始JSON并解析为关联数组 $rawData = json_decode($request->getContent(), true); Log::info(json_encode($rawData['populatedArray'])); Log::info(json_encode($rawData['emptyArray'])); // 这里会输出 [] Log::info(json_encode($rawData['tasks']['fooTask']['empty'])); // 嵌套空数组也能正常获取 }
这个方法的好处是不需要修改全局配置,适合临时需求,但如果多个地方都需要,就不太高效了。
方案2:修改ConvertEmptyStringsToNull中间件(全局生效)
如果你希望整个项目都保留空数组,可以修改默认的ConvertEmptyStringsToNull中间件,让它跳过对空数组的处理。
找到app/Http/Middleware/ConvertEmptyStringsToNull.php文件,修改其中的transform方法:
protected function transform($value) { // 如果是数组,递归处理但不转换空数组 if (is_array($value)) { return array_map([$this, 'transform'], $value); } // 仅对空字符串转null,空数组不做处理 return is_string($value) && $value === '' ? null : $value; }
修改后,中间件只会把空字符串转成null,不管是顶层还是嵌套的空数组,都会被完整保留下来。
方案3:禁用ConvertEmptyStringsToNull中间件(不推荐)
如果你的项目完全不需要把空字符串转成null的功能,可以直接在app/Http/Kernel.php中移除这个中间件:
protected $middleware = [ // ...其他中间件 // \App\Http\Middleware\ConvertEmptyStringsToNull::class, 注释掉这一行 ];
不过这个方法要谨慎使用,因为Laravel的不少默认逻辑依赖这个中间件的处理,可能会引发其他意想不到的问题。
测试一下你原来的请求,用上面的方案1或2,就能在日志里看到期望的[]输出啦!
内容的提问来源于stack exchange,提问作者ajthinking
相关产品推荐
相关产品推荐

