【发布时间】:2020-07-03 19:35:53
【问题描述】:
问题
返回的 JSON 编码正确,但 json_last_error 等同于 5,因此 Laravel 在 JsonResponse->setData() 中创建响应时抛出此异常。
相关参考文献
symfony 和 PHP 7.3 的已解决错误报告:https://github.com/symfony/symfony/issues/31447 提到了这个确切的问题。那就是:
If a json_encode()/json_decode() without JSON_THROW_ON_ERROR encoding option set throws an error, any subsequent call to the same with that flag set will not reset the error of the previous call.
JSON_THROW_ON_ERROR RFC 提及此行为是设计使然:https://wiki.php.net/rfc/json_throw_on_error
不幸的是,Laravel 的代码使用了该标志,但不满足这种行为,并且如果 json_last_error() 返回非零值则抛出异常。在这种情况下应该忽略它,因为它总是引用以前的错误。也许应该添加版本检查。
调查
我还搜索了我的应用程序的碗,并没有发现没有设置 JSON_THROW_ON_ERROR 的行为不端的 json_encode/json_decode,所以我确信在中间件调用之前它是 Laravel 内部的。
附加上下文
今天我们的服务器突然开始发生这种情况。当用户通过选定系统的 Web 应用程序连接到服务器时,就会发生这种情况。即使系统类型不应该影响服务器端响应生成,但 Web 应用程序始终会为特定 PC/移动设备生成此错误。
【问题讨论】:
标签: json laravel symfony exception php-7.4