You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:30:18